2010-02-20 67 views
3

在我的ViewModels中,我使用幾個DataAnnotations來驗證表單數據,每個字段通常有2-3個註釋。第一次失敗後有什麼辦法停止DataAnnotation驗證?

例如,對於一個電子郵件地址字段可能是這樣的:

[Required(ErrorMessage = "Please enter an email address.")] 
[Email(ErrorMessage = "That is not a valid email address.")] // Custom 
public string Email { get; set; } 

現在,如果有人提交表單,這兩個錯誤將在驗證摘要顯示出來。有沒有簡單的方法來指定一個命令來運行驗證註釋,以便如果Required驗證失敗,那麼電子郵件驗證不會運行?

如果這不可行,通常如何處理?我應該爲任何有多個註釋的字段創建自定義驗證器嗎?這將是一種正確的方式來使用註釋,其中一個人處理多種類型的驗證?

(我也知道我可以將Required註釋組合到自定義電子郵件中,但這僅僅是一個例子)。

回答

1

在這種特殊情況下,我可能會採取同樣的做法是,ASP.NET Web窗體驗證拿 - 只要有EmailAttribute驗證返回true如果值是null或空。

想想看:

  • 如果需要的e-mail地址,然後也會有一個[Required]驗證和空/空的e-mail地址無論如何會生成驗證錯誤;

  • 如果電子郵件地址是可選的,則應將空值/空值視爲有效。

當您可以設計單個驗證器以便一起玩時,無需解決截取驗證器的複雜問題!

+0

感謝您的回答。我想你是對的,我可以改變驗證,以便它們一起正常工作,並且在不可能的情況下,將它們合併成一個。 – Brandon 2010-03-04 15:04:53

1

訂購確認:第

在這種情況下,你可以簡單地刪除所需的屬性,因爲「」或「」會失敗的電子郵件地址驗證。

是的,AFAIK創建一個自定義驗證屬性,結合他們兩個可能是你最好的選擇。

1

這裏的問題是,屬性的​​排序完全是任意的,並在編譯時決定。您實際上可以執行簡單的排序,具體取決於您使用的驗證運行程序的類型。如果你正在使用類似XVAL和驗證亞軍就像提到here的一個,你可以添加一個排序依據條款這樣強迫一種特定的屬性進行排序頂端:

orderby attribute.GetType() == typeof(T) ? 0 : 1 

只是做一個strongly-鍵入的驗證跑步者方法,其中T來自ValidationAttribute類。

相關問題