【问题标题】:MVC3 Validating Multiple Fields As A Single PropertyMVC3 将多个字段验证为单个属性
【发布时间】:2011-11-04 17:08:43
【问题描述】:

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

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

要求是:

  1. 它们都是必需的。
  2. 它们必须是数字。
  3. 区号字段不得超过 6 位,电话号码字段不得超过 10 位。

需要为两个字段显示一条消息。例如,如果缺少区号但提供了电话号码,则应在两个字段之后显示一条消息,说明 “请输入电话号码。”

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

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; }
}

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

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

提前谢谢你。

【问题讨论】:

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


    【解决方案1】:

    在两者上应用该属性,并且只有一个 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(new string[3]{"Phone1", "Phone2", "Phone3"}, ErrorMessage ="Phone# required")] ------代码只接受一个数组。我不确定人们是如何使用这些逗号分隔的字符串并使其工作的。
    • 我同意,语法不允许编译东西,ganjeii 是对的
    【解决方案2】:
    [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 字段需要放在类上,而不是单个属性。如果您查看实现,它会查看传入的对象,并迭代其属性。

    【讨论】:

    • 我不太确定这是否正确?如果您查看 Scotts 回答上面的文字,它会说“这允许我在属性级别而不是模型级别实现它......”。此外,在我提供的第二个(类似的)示例中,Darin Dimitrov 给出了在属性级别(在电子邮件属性之上)使用的属性的示例。尽管这两个答案都在属性上进行了迭代,但我认为该错误旨在在属性级别而不是模型级别报告。
    • @Dangerous Darin 的例子更好,我会进一步研究它。但我不明白当它影响到其他属性时,为什么要在单个属性上定义它。
    • 谢谢,但我不想在模型级别定义验证,因为我想针对属性(或本例中的属性组)报告错误。我希望任何错误消息出现在两个电话号码字段的右侧(或下方)。由于我还将为此模型提供其他电话号码字段,因此很难使用模型级别验证针对属性报告错误。我相信 jquery 可以让您以这种方式定义用于用户验证的属性组(不要引用我的话),但如果不定义自定义数据注释,它就不能与 mvc3 数据注释一起使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    相关资源
    最近更新 更多