2012-09-21 42 views
0

我一直在努力重構我現在正在做的模型驗證。我的應用程序都是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的錯誤樣式仍然有效。

回答

0

你真的在尋找FluentValidation

但是,我不知道它是否支持MVC2。但它確實支持MVC3和MVC4。從它的網站

示例代碼:

public class CustomerValidator: AbstractValidator<Customer> { 
    public CustomerValidator() { 
    RuleFor(customer => customer.Surname).NotEmpty(); 
    RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name"); 
    RuleFor(customer => customer.Company).NotNull(); 
    RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount); 
    RuleFor(customer => customer.Address).Length(20, 250); 
    RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode"); 
    } 

    private bool BeAValidPostcode(string postcode) { 
    // custom postcode validating logic goes here 
    } 
}