21

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

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

4

4 回答 4

23

您可以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>
于 2011-11-23T13:27:52.513 回答
16

可以使用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; }
于 2014-05-18T00:24:34.790 回答
1

这是关于条件验证的 MSDN 博客条目:http: //blogs.msdn.com/b/simonince/archive/2011/02/04/conditional-validation-in-asp-net-mvc-3.aspx

于 2011-11-23T13:50:29.850 回答
1

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

于 2012-03-22T22:05:05.020 回答