2010-09-22 147 views
1

我使用DataAnnotations進行驗證(包括客戶端)asp.net MVC2驗證

我有多個字段的形式。單個字段的基本驗證正常工作。現在有至少一個需要有一個值的幾個字段(如果有三個字段,則第一個或第二個或第三個字段應該有一個值)。

我已經閱讀了很多關於這個網站和一些博客文章的文章。但是我找不到可以在上述場景中使用的解決方案。我可能錯過了某些東西或者做錯了。

你能幫忙嗎?

回答

2

試試這個

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] 
public sealed class EitherOr : ValidationAttribute 
{ 
    private const string _defaultErrorMessage = "'{0}' OR '{1}' OR '{2}' must have a value"; 
    private readonly object _typeId = new object(); 

    public EitherOr(string prop1, string prop2, string prop3) 
     : base(_defaultErrorMessage) 
    { 
     Prop1 = prop1; 
     Prop2 = prop2; 
     Prop3 = prop3; 

    } 

    public string Prop1 { get; private set; } 
    public string Prop2 { get; private set; } 
    public string Prop3 { get; private set; } 

    public override object TypeId 
    { 
     get 
     { 
      return _typeId; 
     } 
    } 

    public override string FormatErrorMessage(string name) 
    { 
     return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString, Prop1, Prop2,Prop3); 
    } 

    public override bool IsValid(object value) 
    { 
     if(string.IsNullOrEmpty(Prop1)&&string.IsNullOrEmpty(Prop2) && string.IsNullOrEmpty(Prop3)) 
     { 
      return false; 
     } 
     return true; 
    } 

然後標記與EitherOr屬性類:

[EitherOr("Bar","Stool","Hood", ErrorMessage = "please supply one of the properties")] 
    public class Foo 
    { 
     public string Bar{ get; set;} 
     public string Stool{ get; set;} 
     public string Hood{ get; set;} 
    } 

請注意,我利用字符串屬性,如果你的屬性是其它類型的,makle一定要更改IsValid(object value)驗證

+0

謝謝Dusty,我應該在這種情況下寫什麼javacript驗證腳本?我仍然應該實現DataAnnotationsModelValidator並註冊它? – byte 2010-09-22 15:39:37

+0

如果您使用默認的'Html.ValidationSummary',則不必編寫任何javascript。錯誤消息將顯示在您的驗證摘要中。但是,如果您希望它顯示在每個表單字段旁邊,您將不得不使用:ModelState.AddModelError(「Bar」,「requires a value」); – 2010-09-22 15:55:09

+0

謝謝。這個驗證是否發生在服務器端呢?我正在查看客戶端的輸入驗證以及提供更好的用戶界面,並儘可能避免服務器旅程。服務器端驗證將始終存在。 – byte 2010-09-22 15:58:29