2009-08-28 29 views
3

我對obeject有一個完整的驗證,並試圖找出處理它的最佳方法。整個班級的xVal,DataAnnotations

考慮下面的類:

public class LetterResponse { 
public Guid Id {get;set;} 
public bool SendBlankCart {get;set;} 
public string ToName {get;set;} 
public string ToAddress {get;set;} 
} 

我想用一個dataannotation和XVAL爲了驗證之前,我堅持它的類,但我有複雜的驗證,需要不止一個屬性。

僞:

if SendBlankCart { 
- no validation on ToName, ToAddress 
} else { 
ToName - required. 
ToAddress - required. 
} 

我想詮釋這樣的:

[LetterResponseValidator] 
public class LetterResponse { 
public Guid Id {get;set;} 
public bool SendBlankCart {get;set;} 
public string ToName {get;set;} 
public string ToAddress {get;set;} 
} 

,並有這樣的驗證規則:

public class LetterResponseValidator : ValidationAttribute 
    { 
     public override bool IsValid(object value) 
     { 
      if (value.GetType() == typeof(LetterResponse)) 
      { 
       var letterResponse = (letterResponse) value; 
       if (letterResponse.SendBlankCard) 
       { 
        return true; 
       } else 
       { 
        if (string.IsNullOrEmpty(letterResponse.FromDisplayName) || string.IsNullOrEmpty(letterResponse.ToAddress1)) 
        { 
         return false; 
        } 
        return true; 
       } 

      } 
      return false; 
     } 
    } 

我期待的參數是我的LetterResponse類的實例,但它永遠不會在我的驗證運行器上調用?

有沒有人知道一種方法來處理這個問題?

感謝,

哈爾

回答

2

我不認爲這是與事實,你有一個類級別的驗證做。要排除任何連接,請嘗試將一個必需的驗證器應用於「ToName」並查看驗證器是否被調用。

如果被調用,然後讓我知道,如果不是的話,那麼你應該檢查是否已重寫你的標準模型綁定器與DataAnnotationsModelBinder在你的Global.asax.cs文件:

ModelBinders.Binders.DefaultBinder = new DataAnnotationsModelBinder(); 

對於關於這個和完整工作演示項目的更多細節,請閱讀blog article about client-side validation

+0

是的 - 事實證明我的DataAnnotation runner方法只是檢查屬性,而不是類級別的屬性。謝謝,哈爾 – Hal

+1

你知道我在哪裏可以找到一個DataAnnotationsModelBinder,它可以使用System.ComponentModel.DataAnnotations v 3.5 – Omu

+0

除了我在上面鏈接的博客文章中描述的錯誤。文章還展示瞭如何修復這個bug。 –