2011-11-23 110 views
20

我遇到了ASP.NET MVC 3应用程序的问题。我在我的模型中有两个属性,我只希望其中的一个在我的视图中基于哪个是空的。因此,举例来说,如果我输入一个电话号码,然后邮件不再需要,反之亦然,但如果我离开都为空,则是1应该是必须的,下面是我的模型:模型验证/ ASP.NET MVC 3 - 条件所需属性

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

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

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

回答

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> 
+0

如何对客户端验证? – jgauffin

+2

可能通过添加自定义规则来挂钩jQuery验证插件。 '$( '形式')来验证(); $('form')。rules('add',{“ContactPhoneNumber”:{depends:function(el){return!$('#ContactEmailAddress')。val();}}});'或者类似的 – tvanfosson

+0

I我们已经探索了一点点,但还没有找到一种简单的方法来创建一个钩入自动化客户端验证框架的属性。如果您有兴趣,可以跟踪CompareAttribute的处理方式,看看是否可以用类似的方式扩展框架。 – tvanfosson

1

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

15

有条件的验证可以使用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; }