【问题标题】:Model Validation / ASP.NET MVC 3 - Conditional Required Attribute模型验证/ASP.NET MVC 3 - 条件必需属性
【发布时间】:2015-12-09 23:17:58
【问题描述】:

我的 ASP.NET MVC 3 应用程序出现问题。我的模型中有 2 个属性,因此我只希望在我的视图中需要其中 1 个属性,无论哪个是空的。因此,例如,如果我输入电话号码,则不再需要电子邮件,反之亦然,但如果我将两者都留空,则应需要 1,以下是我的模型:

[Display(Name = "Contact Phone Number:")]
[MaxLength(150)]
public string ContactPhoneNumber { get; set; }

[Display(Name = "Contact Email Address:")]
[MaxLength(100)]
public string ContactEmailAddress { get; set; }

我是否需要创建一个自定义属性来验证我的模型,如果需要,我将如何实现这一点?

【问题讨论】:

    标签: asp.net-mvc-3 model-validation


    【解决方案1】:

    您可以在您的类上实现IValidatableObject,并提供一个Validate() 方法来实现您的自定义逻辑。如果您希望确保提供一个,请将此与客户端上的自定义验证逻辑结合起来。我发现这比实现属性更容易。

    public class ContactModel : IValidatableObject
    {
       ...
    
       public IEnumerable<ValidationResult> Validate( ValidationContext context )
       {
            if (string.IsNullOrWhitespace( ContactPhoneNumber ) 
                && string.IsNullOrWhitespace( ContactEmailAddress ))
            {
                 yield return new ValidationResult( "Contact Phone Number or Email Address must be supplied.", new [] { "ContactPhoneNumber", "ContactEmailAddress" } );
            }
       }
    }
    

    要让客户端的一切正常工作,您需要将以下脚本添加到您的视图中:

    <script type="text/javascript">
    $(function() {
        $('form').validate(); 
        $('form').rules('add', { 
            "ContactPhoneNumber": { 
                depends: function(el) { return !$('#ContactEmailAddress').val(); } 
            } 
        });
    });
    </script>
    

    【讨论】:

    • 客户端验证怎么样?
    • 可能通过添加自定义规则挂钩到 jQuery 验证插件。 $('form').validate(); $('form').rules('add', { "ContactPhoneNumber" : { depends: function(el) { return !$('#ContactEmailAddress').val(); } } } ); 或类似
    • 我已经摸索了一下,但还没有找到一种简单的方法来创建一个挂钩到自动客户端验证框架的属性。如果您有兴趣,可以跟踪 CompareAttribute 的处理方式,看看是否可以使用类似的东西扩展框架。
    • 我冒昧地将客户端代码添加到您的答案中。 +1
    【解决方案2】:

    可以使用ExpressiveAnnotations定义基于注释的条件验证:

    [RequiredIf("ContactPhoneNumber == null",
        ErrorMessage = "At least email or phone should be provided.")]
    public string ContactEmailAddress { get; set; }
    
    [RequiredIf("ContactEmailAddress == null",
        ErrorMessage = "At least email or phone should be provided.")]
    public string ContactPhoneNumber { get; set; }
    

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        我知道您已经有了解决方案,但我也遇到过类似的情况,所以也许我的解决方案对其他人有帮助。我实现了一个带有客户端验证的自定义属性。这是我的博文:http://hobbscene.com/2011/10/22/conditional-validation/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-12
          • 1970-01-01
          • 2011-12-24
          • 1970-01-01
          • 2012-05-15
          • 2012-01-24
          • 2021-07-02
          • 1970-01-01
          相关资源
          最近更新 更多