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

时间:2011-11-04 17:08:43

标签: c# asp.net-mvc-3 validation

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

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

要求是:

  1. 他们都是必需的。
  2. 它们必须是数字。
  3. 区号代码字段最多为6位数,电话号码字段最多为10位数。
  4. 两个字段都需要显示一条消息。例如,如果区域代码丢失但提供了电话号码,那么在两个字段显示“请输入电话号码”后,应显示一条消息。

    我目前的模型类似于:

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

    我无法将电话实现为具有正则表达式或类似物的单个字段。

    here存在类似的问题(也类似于here),答案建议创建自定义验证属性(在本例中名为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是上面的模型)报告。因此,如果用户未输入AreaCode但提供了PhoneNumber,则会针对PhoneNumber字段而不是AreaCode报告错误。此外,如果您使用随Visual Studio Internet项目提供的CSS,则提供的PhoneNumber字段将显示为红色,而无效区域代码显示为白色(未显示错误),因此这看起来有点奇怪。

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

    提前谢谢。

2 个答案:

答案 0 :(得分:3)

在两者上应用该属性并且只有一个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>

答案 1 :(得分:1)

[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字段放在类上,而不是单个属性。如果你看一下实现,它会查看传入的对象,并迭代它的属性。