2011-06-24 70 views
1

假設您已經爲TeddyBear模型創建了一個創建視圖和控制器。讓我們假設TeddyBear有一個可選的MommyBear財產(一int),它是通過在作爲ID(通過查詢字符串或只是"example.com/Bears/Create/#"在視圖或控制器中設置模型屬性?

有兩種方法我可以設置對新TeddyBearMommyBear屬性:

在視圖中,與

@{ 
    ViewBag.Title = "Create"; 
    Model.MommyBear = Request["id"]; 
} 

或控制器中,具有:

 [HttpPost] 
     public ActionResult Create(TeddyBear bear, int id) 
     { 
      bear.MommyBear = id; 
      ... 

無論哪種方法更高效?使用任何一種都有危險嗎?最佳做法是什麼?

回答

2

我總是使用我的控制器來構建我的模型,然後讓視圖呈現該模型,但我認爲合適。要回答您的問題,請在您的控制器內部設置屬性以獲得最佳實踐,這樣,如果您的模型發生更改,則不會與您的視圖綁定。您可以使用更多模式,例如存儲庫模式和視圖模型,但我認爲這可以解答您的問題。

我儘量保持視圖外的所有邏輯。在Bears控制器的Create方法中,將MommyBear的值設置在那裏,然後將其作爲模型綁定到視圖,並且它已經爲您設置。 HTH! ;)

+0

+1(如果我的手機會讓我...)提及模型更改的可能性。但是,然後,你必須改變控制器反正...... –

+0

添加該評論到你的答案和虐待接受它,如果我沒有得到任何更好的tommorow;) –

+0

@Thomas - 很高興我可以幫助。祝你有個好的一天! – webtrifusion

1

,如果你有在Global.asax中定義如下

routes.MapRoute(
       "bear", 
       "{controller}/{action}/{MommyBear}", 
       new { action = "Index", MommyBear = "" } 

      ); 

的路線,你有一個像

[HttpPost] 
    public ActionResult Create(TeddyBear bear) 
    { 
     //bear.MommyBear = id;//The Property will be automatically bound to Mommybear 
    } 

現在你唯一要做的就是之前把這個路由操作方法默認一個。發生這種情況是因爲modelbinder還會查看routevalue字典中的其他位置(表單帖子,json帖子,查詢字符串等)的模型值。不過有一點需要注意的是上面的路線會一直匹配,並且請求不會得到

"{controller}/{action}/{id}" route 

你可以做的另一件事把http://localhost/Bear/Create?MommyBear=1和模型綁定將Mommybear財產查詢字符串綁定。
注意我不鼓勵您使用查詢字符串或更改您的默認路由僅用於綁定目的。目的是顯示模型值可以填充的方式

0

您不應該從視圖更新模型。這是控制者的責任。

沒有理由在您的操作方法上爲「Id」指定單獨的參數。只需將一個Id屬性添加到您的viewmodel中,ASP.NET MVC將爲您處理模型綁定。

相關問題