2011-07-30 95 views
1

ASP.NET MVC3有沒有可能在FormCollection中設置視圖模型的屬性而不調用屬性上的驗證屬性指定的驗證? UpdateModel<T>(T model)也會調用驗證。UpdateModel without validation

背景:

我只能驗證模型如果向數據庫的連接存在,但此連接只能被建立,如果從一個特定的表單字段中的數據是正確的(種的訪問每個組織的代碼)。如果連接未建立,則拋出異常。

當在此字段中輸入的數據不正確時,我不想丟失在所有其他表單域中輸入的值,但將已輸入的值再次呈現給用戶並給他更改以糾正錯誤。

所以我需要的東西基本上就像條件驗證或模型綁定器根本沒有驗證。 在ASP.NET MVC中是否有像這樣內置的內容,或者是否需要編寫我自己的UpdateModel方法,調用(自定義)模型聯編程序?

回答

2

爲什麼不將viewmodel傳遞到您的方法而不是formscollection?這樣,你可以做

[HttpPost] 
public ActionResult Update(UpdateViewModel model) 
{ 
    if (!Model.IsValid) 
    { 
     return View(model); 
    } 
} 

因此,如果驗證失敗,您的用戶將被引導回更新視圖,從他們提交的信息已經填充模型。

現在,在我看來,擁有一個驗證屬性需要數據庫連接,這反過來可以拋出異常是錯誤的方式去做這件事。我將這些驗證轉移到驗證服務中,該服務被注入控制器(並通過DI接收它需要的存儲庫內容)。每個驗證服務將採用視圖模型並返回一組ValidationResult實例,然後我通過extension method將其附加到模型validation result s到控制器類(都從項目Silk原件MS P & P推出)

這允許更容易的測試,因爲您可以模擬存儲庫並使其返回正確的結果以進行測試...

+0

驗證邏輯(實現爲驗證屬性)會拋出異常,如果沒有連接到數據庫可用(現在情況並非如此)。因此,步驟如下:1.檢查fieldA的值是否正確 - 2.根據fieldA的值連接到數據庫 - 3.更新並驗證模型。如果fieldA的值無效,則步驟2和步驟3是不可能的。當然,我可以只捕捉異常,但這些是EF引發的異常,它本身在存儲庫模式後面「隱藏」。所以這不是一個乾淨的解決方案。 – Peter

+0

好的,那麼,你做錯了*咧*將擴大我的答案 – blowdart

+0

感謝您的廣泛解釋。您的權利是整體設計可能不是最佳的,但我的實際問題更多地針對是否實際上有方法更新模型而無需驗證。因此我仍然離開它。也許有人想出了一個想法。 – Peter