2011-06-15 89 views
53

我正在使用ASP.NET MVC 3代碼優先,並且已將驗證數據註釋添加到我的模型中。下面是一個例子模型:手動調用ModelState驗證

public class Product 
{ 
    public int ProductId { get; set; } 

    [Required(ErrorMessage = "Please enter a name")] 
    public string Name { get; set; } 

    [Required(ErrorMessage = "Please enter a description")] 
    [DataType(DataType.MultilineText)] 
    public string Description { get; set; } 

    [Required(ErrorMessage = "Please provide a logo")] 
    public string Logo { get; set; } 
} 

在我的網站我有一個多步驟的過程創建一個新的產品 - 第1步中輸入產品的詳細信息,步其他2信息等各步驟間我存儲的每個對象(即產品對象),因此用戶可以返回到該流程的這個階段並修改他們輸入的數據。

在每個屏幕上,我都使用新的jQuery驗證罰款處理客戶端驗證。

最後階段是在數據庫中產品被創建之後的確認屏幕。但是,因爲用戶可以在階段之間跳轉,所以我需要驗證對象(產品和其他人)以檢查他們是否已正確完成數據。

有沒有什麼辦法可以在具有數據註釋的對象上以編程方式調用ModelState驗證?我不想通過對象上的每個屬性並進行手動驗證。

我願意如何,如果它可以更容易地使用ASP.NET MVC模型驗證功能3.

回答

68

你可以調用Controller行動中ValidateModel方法改進這個過程的建議(documentation here )。

+12

謝謝,我用TryUpdateModel()到底,所以我並沒有引發異常。 – 2011-06-15 17:02:41

2

我發現這個工作,如預期做準確..顯示在ValidationSummary對一個GET操作方法新鮮檢索對象...未經任何

Me.TryValidateModel(MyCompany.OrderModel) 
35

您可以使用ValidateModelTryValidateModel控制器範圍。

當正在驗證一個模型,對於所有屬性的所有的驗證是 運行如果至少一種形式中輸入被綁定到模型屬性。 ValidateModel與TryValidateModel方法類似,但如果模型驗證失敗,則 TryValidateModel方法不會引發InvalidOperationException異常 異常。

ValidateModel - 如果模型無效則拋出異常。

TryValidateModel - 返回指示模型是否有效的布爾值。

如果您逐個驗證型號列表,則需要通過調用ModelState.Clear()來重置每次迭代的ModelState。

Link to MSDN

+0

我有一個必填字段爲空,並使用「ModelState.Clear()」,並且ModelState.IsValid爲true。 – 2016-02-27 13:04:43

+1

它適用於我把「ModelState.Clear();」和「TryValidateModel(myModel);」。謝謝 – 2016-02-27 13:13:52

+0

考慮到這一點後,這看起來很明顯,但如果驗證屬性中存在任何驗證錯誤,則不會調用您的自定義'Validate'方法** **。 – Jess 2016-06-15 19:03:01