2012-06-22 26 views
18

我有一個幫助器類傳遞了一個值的數組,然後傳遞給我的模型中的一個新類。我如何驗證給這個類的所有值是有效的?換句話說,我如何在非控制器類中使用ModelState的功能。檢查模型是否在控制器之外有效

從控制器:

public ActionResult PassData() 
{ 
    Customer customer = new Customer(); 
    string[] data = Monkey.RetrieveData(); 
    bool isvalid = ModelHelper.CreateCustomer(data, out customer); 
} 

從助手:

public bool CreateCustomer(string[] data) 
{ 
    Customter outCustomer = new Customer(); 
    //put the data in the outCustomer var 
    //??? Check that it's valid 

} 

回答

33

您可以使用數據註釋驗證的ASP.NET環境之外:

public bool CreateCustomer(string[] data, out Customer customer) 
{ 
    customer = new Customer(); 
    // put the data in the customer var 

    var context = new ValidationContext(customer, serviceProvider: null, items: null); 
    var results = new List<ValidationResult>(); 

    return Validator.TryValidateObject(customer, context, results, true); 
} 
+0

不幸的是,這種驗證不通過任何複雜的子對象或集合遞歸。 Validator.TryValidateObject(...)只是立即進行屬性和字段驗證,並將其稱爲一天,而不是在MVC世界中的Controller中的模型綁定上發生的驗證,該驗證遍歷整個對象圖。 – neumann1990

1

別在控制器外部使用ModelState。我無法看到Monkey.RetrieveData()做了什麼,但通常我不會傳遞a)來自HTTPRequest的純數據和b)類似字符串數組的無類型數據到後端。讓web框架檢查在後端使用的包含數據和實例類型的類。請注意,檢查HTML注入(XSS腳本等)必須手動完成,如果您手動應用您的數據。

而是使用模型綁定器等,並將類型化的數據(例如客戶類實例)傳遞到後端。有一個從斯科特谷的舊帖子裏介紹本作MVC1:http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx

在您的例子中,讓模型MVC的結合創造你的客戶和應用所需的字段值(見上面的圖案是如何工作的鏈接)。然後,將您的客戶實例提供給您的後端,您可以根據您輸入的客戶實例(例如手動或使用數據註釋)進行額外的驗證檢查。