2012-05-31 17 views
8

我最近開始使用MVC,並且我感到有點失望。這個框架不是幫助我,而是阻礙我。如何獲得對模型綁定的控制權?

我試圖寫這樣的(僞代碼)的控制器操作

ActionResult Save(long id, string whichForm) 
{ 
    if (whichForm == "A") 
    { 
     var vm = CreateModel(Request.Form); 
     if (!TryValidate(vm)) 
      return View(vm); 
     else 
      return RedirectToRoute("Success"); 
    } 
    else .... 
} 

基本上我想有,當我的視圖模型,並當它被驗證過的控制。這可能嗎?我如何實現CreateModel方法?考慮我可能想在這個控制器動作中創建幾個不同的視圖模型。

* Rant:我不明白爲什麼視圖模型綁定和驗證在DefaultModelBinder中混合在一起。看起來像代碼味道。特別是當很難覆蓋這種行爲時。

+1

感謝您的downvotes,關心發表評論? :-) – Kugel

+0

+1也許他們不喜歡你的* Rant,但你有權獲得你的意見,而且我沒有看到這個問題沒有錯。如果問題得到了很好的答案,那麼問題就很好。 – AaronLS

回答

16

您可以創建和綁定到你的自由裁量權的現有模式:

public ActionResult Save(long id, string whichForm) 
{ 
    if (whichForm == "A") 
    { 
     var vm = new FormAViewModel(); 

     if (!TryUpdateModel(vm)) 
      return View(vm); 
     else 
      return RedirectToRoute("Success"); 
    } 
    // else .... 
} 

You also have the option of creating your own IModelBinder,如果你想在結合過程的完全控制。您可以替換默認的模型聯編程序,或者您可以註冊特定類型的特定IModelBinder實現。然而,我會建議,除非您的綁定邏輯很簡單,否則您可能需要從DefaultModelBinder中派生出自定義模型聯編程序,並覆蓋您不喜歡的部分。

我不喜歡留下一個巨大的評論,但10個人中有9個認爲框架在他們的方式是因爲他們還不知道如何正確使用它。 Here is an article with general tips on model binding

至於你的評價:驗證和綁定是分開的,然而,默認的模型聯編程序確實會觸發驗證。這樣做的原因是允許應用程序正常處理綁定到丟失/無效/不完整值的問題,而不是讓綁定失敗或引發異常。

+0

非常感謝,我完全錯過了TryUpdateModel方法。相信我,我一直在尋找一段時間,並閱讀了關於DefaultModelBinder和IModelBinder的所有內容。另外通過MVC源代碼... – Kugel

0

您可以利用IModelBinder界面並編寫完整的自定義模型聯編程序。這裏解釋得很好。從本質上講,這個接口公開了一個方法「BindModel」,你可以控制模型綁定行爲和驗證。

http://www.dotnetcurry.com/ShowArticle.aspx?ID=584

然而,這可能將問題複雜化,你可能會在意大利麪條代碼得到。我會建議一個簡單的「每個模型的動作」,如果它適合你。所以你可以寫這樣的東西:

ActionResult SaveA(long id, AViewModel) 
{ 
     //.... Action to be conducted in case it is form A. 
} 
ActionResult SaveB(...., BViewModel) 
{ 
     //... Action to be conducted in case it is form B. 
} 


// Your view models can be structured for code reuse as well. 
class AViewModel { ... } 
class BViewModel : AViewModel { ... } 
+0

對不起,但你錯過了我的問題的重點。 – Kugel