1

經過一年左右的MVC經驗,我仍然對一件事感到困惑:如何有效地將ModelAnnotations與ModelState.IsValid一起使用?對於簡單的教程示例,這一切都很好,我對此毫無疑問。但是,我認爲有以下型號:MVC模型綁定/驗證

Public Class Movie 

    Public Property MovieID As Integer 
    Public Property Title As String 
    Public Property Year As Integer 
    Public Property AddedByUser As String 

End Class 

現在場AddedByUser需要在數據庫中,但是我不希望用戶提供這個,而是基於在當前登錄用戶的業務邏輯。我如何使用這種情況下的DataAnnotation屬性?如果我要求這個字段,然後在控制器,當我說:

Public Function SaveMovie(ByVal entity as Movie) As ActionResult 
    If ModelState.IsValid 
     // Save to DB here... 
    End If 
    Return View(entity) 
End Function 

...驗證將失敗,因爲我沒有視圖綁定中的該字段。我應該有一個隱藏的領域嗎?我應該爲SaveMovie操作編寫自定義視圖模型嗎?我想我可以在業務邏輯中編寫自己的驗證,但爲什麼要使用模型驗證呢?自定義模型粘結劑也許?處理這些類型場景的最佳方式是什麼?

只是爲了給出另一個示例場景,插入和更新操作與驗證之間的區別如何?對於更新操作,對象的主鍵是必需的。但是插入不是這種情況。你是否應該爲這個關鍵屬性插入和更新單獨的模型?

回答

1

所以我處理這個的方式是我使用基於DataAnnotation的驗證用戶輸入類型的東西。即對電子郵件地址,日期,必填字段等進行驗證。您需要快速進行「完整性檢查」並需要仔細檢查用戶條目。

我不會在我的數據庫控件或我的代碼控制的字段上放置任何DataAnnotations,即主鍵,您的[AddedByUser]屬性作爲用戶不直接訪問這些屬性,因此您不應該對此添加驗證檢查。由於你的代碼是唯一更新這些屬性的東西,爲什麼要驗證它們呢?

對於更多的「業務規則」類型驗證我在我的模型上實現了IValidatableObject,該模型在所有屬性級驗證成功後都在MVC中運行。請注意,如果屬性級驗證失敗,它將不會運行。這是有道理的,因爲如果數據是'髒',你不想繼續運行更復雜的驗證等。

希望這會有所幫助:)