Asp.net-Mvc
驗證 ASP.NET MVC 中的 ViewModel
大多數關於如何在 ASP.NET MVC 中實現驗證的技巧似乎都圍繞著模型(在模型和控制器之間建構服務層或使用驗證屬性裝飾模型的屬性)。
在我的應用程序中,我使用 ViewModels 進行控制器和視圖之間的所有通信。
我的登錄頁面有一個名為“LoginViewModel”的 ViewModel,其屬性名為“EmailAddress”。
當使用者輸入他們的電子郵件地址並點擊送出時,此 ViewModel 會被填充並發送到控制器,在那裡驗證電子郵件地址。
它必須是有效的電子郵件地址,並且使用者必須來自在系統中註冊的域。
對此添加驗證的便捷方法是什麼?我應該將驗證放在 ViewModel 本身嗎?還是應該留在控制器中?
“我應該將驗證放在 ViewModel 本身中嗎?還是應該留在控制器中”我同意羅伯特的觀點,但我會添加一個外掛以實現額外的自動化。
如果您查看諸如xVal 之類的工具,您會發現正常驗證(例如,必填欄位、範圍內的數字、匹配正則表達式的字元串)可以通過修飾數據類的欄位來自動完成。事實上,xVal 可以自動編寫 JavaScript 進行例行驗證,以便在客戶端執行。無需編寫任何程式碼。更深入的驗證(例如,該使用者是否是在我們數據庫中註冊的域的成員?)發生在模型層本身的伺服器端。
使用 ViewModel 慣用語可能會給這個方案帶來一些挑戰。我目前的方法是將我的實體對象嵌入到我的視圖模型中,例如
public class Contact { [Required] string Name { get; set; } } public class ContactView { public Contact Contact { get; set; } public string SomeOtherViewProperty { get; set; } }然後在控制器中,更新模型時會發生淺驗證:
UpdateModel(contactViewModel.Contact, "Contact");需要更多資訊或更複雜計算的驗證發生在模型層本身內部。
另一種方法是不嵌入實體對象,而只是在兩者之間映射各個欄位。我最近知道了一個名為AutoMapper的工具,它可以自動連結域和視圖模型對象之間的欄位。看起來它應該支持這種驗證方法,雖然我還沒有使用它。