2010-06-26 112 views
1

我想創建一個自定義模型綁定器來驗證有界模型。我發現了幾個這樣的例子,它的工作原理應該如此。但是,如果模型中存在錯誤,我還希望能夠將用戶發回到他來自的頁面。自定義模型綁定器

這樣做是否可行?是否有任何明顯的副作用?

我想要實現的是控制器總是獲取有效的命令,所以我不需要檢查action.Method中的model.IsValid()。

+0

您可以分享您已閱讀的文章,並顯示您目前爲止的代碼嗎? – 2010-06-26 08:50:30

+0

達林,我不能分享我的代碼atm,但這裏有一篇關於它的文章。 http://schotime.net/blog/index.php/2009/05/11/fluent-validation-model-binder-aspnet-mvc/我不使用Fluent驗證,但概念是相同的。 – walie 2010-06-28 06:02:24

回答

3

你試圖做的看起來不錯,但它不會工作。限制太多了。

  1. 通常,只有控制器可以決定在出現錯誤的情況下重定向到哪裏。您可以使用其他屬性,如[OnError(「Action」)],但看起來像解決方法。
  2. 表格不發帖全部數據。例如,下拉列表,輔助值必須由控制器填寫。你可以使用動作過濾器來實現這一點,但這又一次看起來像是黑客。

您可以設置將檢查模型錯誤(活頁夾設置)和重定向(setup.Result)的全局操作過濾器(在基本控制器上)。但是這很複雜,需要太多額外的「代碼」 - 屬性等,這些很難跟蹤並與真實的應用程序邏輯相關聯。它變得過於嚴格很快(見漏抽象法),當你需要不出錯重定向只是簡單的動作名稱等

這看起來簡單,當這樣做:

public ActionResult PostAction(ViewModel data) 
{ 
    if (!ModelState.IsValid) 
     return View("GetAction", data.WithDropDownList(repository.GetProducts())); 

} 

在上面的例子中,控制器可以控制工作流程,就像它應該那樣。它也有自由執行額外的驗證/設置。你仍然可以使用盡可能多的基礎設施 - 模型粘合劑來提供模型狀態錯誤等 - 但只有控制器應該對輸入和輸出做出最終決定。

+0

你是對的,它的控制者應該處理這些錯誤,我會堅持我的驗證模型構建器並讓控制器處理這個動作。 – walie 2010-06-28 06:00:15