我一直在努力重構我現在正在做的模型驗證。我的應用程序都是ASP.NET MVC 2(.Net 3.5框架)。我已經閱讀了這個主題的相關問題,它們與我所問的不完全一樣。如何在ASP.NET MVC 2應用程序中執行復雜的模型驗證?
目前,對於頁面驗證,我通常堅持使用if/else語句的大雜燴。問題是,如果字段A是特定值,則字段B有時會被驗證,但是字段A也具有它自己的驗證。在某些情況下,角色會發揮作用,這也可能會根據用戶的角色(即,不驗證具有角色x的用戶無法修改的字段)來驗證驗證。
我的問題歸結到這一點:
1)我如何處理在驗證更容易閱讀的方式?我查看了DataAnnotations,但它們還不夠。數據註釋處理字段值的驗證,其中可能需要完成的驗證取決於字段的值和對象上其他屬性的值。
2)如何將驗證框架與ASP.NET MVC 2集成?
我真的恨我怎麼做我的驗證的事情,現在是,當我添加了一個模型誤差,我硬編碼該屬性的關鍵。這很糟糕。不過,我不知道如何獲得所述屬性的關鍵字,以便它匹配由html幫助程序創建的html字段。
例如,在我看來,我使用的是編輯模板,以顯示我的客戶對象的字段。
<%= Html.EditorFor(m => m.CustomerInfo) %>
生成的HTML的一部分的名字創建領域:
<input id="CustomerInfo_FirstName" name="CustomerInfo.FirstName" style="width:330px;" type="text" value="John" />
爲了使框架仍然突出必要的CSS領域,我迫使該驗證像這樣:
//Ignore that this can be done with DataAnnotations. This is just a simple example.
if (String.IsnullOrEmpty(customerInfo.FirstName))
{
ModelState.AddModelError("CustomerInfo.FirstName",
"First Name is required.");
}
這就是我所看到的主要問題。我沒有一個很好的方法來知道頁面上的字段名稱。它似乎採取的格局
<objectname>.<propertyname>
,但我真的想要更可靠的東西。
爲了使這個對象的名字,我想我可以拉出來的ModelBindingContext類的,但我不知道如何從控制器的內部得到這方面的一個實例。對於屬性名稱,我可以使用一些lambda,它將以字符串的形式返回屬性的名稱。總結一下,我正在尋找:1)某種驗證框架,允許進行復雜的驗證2)某種方式來識別在ModelState.AddModelError方法中使用的密鑰,以便MVC的錯誤樣式仍然有效。