MVC3正在将多个字段验证为单个属性

本文关键字:验证 单个 属性 字段 MVC3 | 更新日期: 2023-09-27 18:13:29

我正在尝试验证包含在两个字段中的电话号码。

第一个字段显示区号,另一个字段显示剩余的电话号码数字。

要求是:

  1. 它们都是必需的
  2. 它们必须是数字
  3. 区号字段最多只能是6位数字,电话号码字段最多不能是10位数字

两个字段都需要显示一条消息。例如,如果区号丢失,但提供了电话号码,则应在两个字段后显示一条消息,说明"请输入电话号码。">

我目前拥有的型号类似于:

public class Customer
{
    //...other fields here
    public string AreaCode { get; set; }
    public string PhoneNumber { get; set; }
}

我无法将电话实现为带有正则表达式或simlar的单个字段。

这里有一个类似的问题(也有点类似(,答案建议创建一个自定义验证属性(在本例中命名为MultiFieldRequired(,以指定属性中所需字段的名称。验证属性然后使用反射来检查其他属性的值,以报告是否存在错误。

例如,在上述模型的情况下,我认为我应该具有:

public class Customer
{
    //...other fields here
    public string AreaCode { get; set; }
    [MultiFieldRequired("AreaCode", "PhoneNumber", ErrorMessage="Please enter a phone number")]
    public string PhoneNumber { get; set; }
}

然而,我在提供的解决方案中遇到了一个小问题。自定义验证属性返回的错误仅针对具有数据注释的字段报告(PhoneNumber是上面的模型(。因此,如果用户没有输入区域代码,但提供了电话号码,则会根据电话号码字段而不是区域代码报告错误。此外,如果您使用的是visual studio Internet项目提供的css,则提供的PhoneNumber字段将显示为红色,而无效的区号显示为白色(没有显示错误(,因此这看起来有点奇怪。

有没有人有办法纠正这种着色行为,或者如果任何一个字段出现错误,我可以报告错误消息(在字段上使用正确的着色(?

提前谢谢。

MVC3正在将多个字段验证为单个属性

在两者上应用属性,并且只有一个ValidationMessageFor(任何人(,并将其放置在您想要显示消息的位置(从帖子来看,您似乎只想要一条错误消息(。

public class Customer
{
    //...other fields here
    [MultiFieldRequired("AreaCode", "PhoneNumber", ErrorMessage="Please enter a phone number")]
    public string AreaCode { get; set; }
    [MultiFieldRequired("AreaCode", "PhoneNumber", ErrorMessage="Please enter a phone number")]
    public string PhoneNumber { get; set; }
}

查看

    <div class="editor-label">
        @Html.LabelFor(model => model.AreaCode)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.AreaCode)
    </div>
    <div class="editor-label">
        @Html.LabelFor(model => model.PhoneNumber)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.PhoneNumber)
        @Html.ValidationMessageFor(model => model.PhoneNumber)
    </div>
[MultiFieldRequired("AreaCode", "PhoneNumber", ErrorMessage="Please enter a phone number")]
public class Customer
{
    //...other fields here
    public string AreaCode { get; set; }
    public string PhoneNumber { get; set; }
}

所需的Multi-字段需要放在类上,而不是单个属性。如果您查看实现,它就是查看传入的对象,并对其属性进行迭代。