【问题标题】:Validating a property if another property has a value on MVC 3/jQuery Validator如果另一个属性在 MVC 3/jQuery Validator 上有值,则验证一个属性
【发布时间】:2011-07-19 22:07:46
【问题描述】:

只有当 Prop1 为真时,我如何才能在属性 Prop2 中使用必需的验证?

Ex:
public bool Prop1 { get; set; }

[Required] // I need this validation only if the Prop1 is true.
public string Prop2 { get; set; }

有什么想法吗?我需要在客户端和服务器端。 谢谢

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 validation jquery-validate


    【解决方案1】:

    这有两个部分。首先,您必须编写一个仅当其他属性符合您的条件时才需要的必需属性。

    您必须执行以下操作:

    public class RequiredComparerAttribute : RequiredAttribute
    {
        public OtherProperty { get; set; }
        public override bool IsValid(object value)
        {
            // TODO: use reflection to validate other property as PropertyInfo 
            // or validate it's value after it is decided to be valid
    
            foreach (ValidationAttribute va in property
                .GetCustomAttributes(typeof(ValidationAttribute), true)
                .OfType<ValidationAttribute>())
            {
                if (!va.IsValid(value))
                {
                    return false; // not required
                }
            }
            return  true; // required
        }
    }
    

    然后,在 Global.asax 的 Application_Start 中,您必须注册验证器,您可以重复使用 RequiredAttribute 的验证器:

            DataAnnotationsModelValidatorProvider
                .RegisterAdapter(typeof(RequiredComparerAttribute),
                  typeof(RequiredAttributeAdapter));
    

    如果您想添加自己的验证器,则必须编写自定义验证器。 Phil Haack 在他的博客上有一个例子:http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

    编辑:查看 .NET Reflector 中的 CompareAttribute,了解如何获取 OtherProperty 的值。 CompareAttribute 还实现了IClientValidatable 以提供客户端所需的那些验证规则。

    认为 CompareAttribute 对您有用,因为您必须根据另一个属性的内容验证是否需要一个值,而不是比较两个属性的相等性。

    Edit2:验证提供者做什么?

    它将规则添加到表单并为这些规则提供消息。通过下载 MVC 3 源代码,您可以准确了解 RequiredAttributeAdapter 是如何做到这一点的。要了解它在客户端的作用,您可以在 Google Chrome 中打开 MVC 3 页面,按 CTRL+SHIFT+J 调出开发人员工具窗口并输入:

    $('form:first').data().unobtrusiveValidation.options
    

    options 中的 rules 对象指定如何验证每个项目,message 对象指定将针对每个验证错误显示的错误消息。

    Edit3:完整示例

    自从回答了这个问题后,我写了一篇博文,其中包含在客户端(不显眼的验证)和服务器上创建自定义属性的完整示例。博文是here。此示例适用于“包含”属性,但应该很容易修改以成为必需的比较。

    【讨论】:

    • 谢谢,但我认为自定义验证器是最好的方法。 :)
    • @Cesar:从 CustomValidationAttribute 继承可能是可行的方法,因此您不必做反射部分,但这篇文章告诉您如何实现服务器端和客户端“自定义验证器”。如果您指的是客户端的验证规则,这里有一个很好的解释:bradwilson.typepad.com/blog/2010/10/…
    • 我写了一篇关于如何创建自定义 DataAnnotations 属性以在客户端和服务器上进行验证的博客文章。 Read it heresource code here
    【解决方案2】:

    您可以使用MVC FoolProof 验证框架

    它有一些有用的功能,比如

    [RequiredIf]
    [RequiredIfNot]
    [RequiredIfTrue]
    [RequiredIfFalse]
    [RequiredIfEmpty]
    [RequiredIfNotEmpty]
    [RequiredIfRegExMatch]
    [RequiredIfNotRegExMatch]
    
    [Is]
    [EqualTo]
    [NotEqualTo]
    [GreaterThan]
    [LessThan]
    [GreaterThanOrEqualTo]
    [LessThanOrEqualTo]
    

    希望对您有所帮助!

    【讨论】:

      【解决方案3】:

      您可以为此工作编写自定义验证器。

      如果您需要帮助,请告诉我。

      【讨论】:

      • CustomValidator 用于 WebForms。他在询问 MVC 中的 DataAnnotations。
      • 什么?!您不知道您可以编写自定义验证器并在 MVC 中使用它吗?!观看此 BradWilson 演示并学习! bradwilson.typepad.com/blog/2011/02/…
      • 我是说 CustomValidator msdn.microsoft.com/en-us/library/… 与您添加到 jQuery 验证插件的规则不同。通过添加验证提供程序,如我的回答,您指定了添加的规则。这些由 jQuery 在 DOM 上解析。添加单个验证脚本不如允许 DataAnnotations 框架为您生成这些规则那样灵活或可重用。
      猜你喜欢
      • 2021-12-28
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多