生活随笔
收集整理的這篇文章主要介紹了
(转)MVC模式参数传递的探究
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
原文地址:http://www.cnblogs.com/dingding3/archive/2010/08/21/MVC.html
最近公司一直在用MVC模式寫程序,所以最近一直再查MVC的資料,目前在研究MVC的參數(shù)傳遞方法,因此有了此文。 MVC模式既可以通過Model傳遞參數(shù),也可以用ViewData來保存數(shù)據(jù),兩種方式的組合傳遞參數(shù)就是一種新的模式了。 使用這種組合傳參的新模式可以非常快的實現(xiàn),但美中不足的是輸入錯誤會導致錯誤,不能在編譯時發(fā)現(xiàn)錯誤原因,而且ViewData必須要用as來轉(zhuǎn)換。 從Controller 傳遞數(shù)據(jù)到View 視圖模板 MVC模式一個典型的特征是嚴格的功能隔離。Model模型、Controller控制器和View視圖各自定義了作用和職責,且相互之間以定義好的方式進行溝通。這有助于提升測試性和代碼重用。 當Controller決定呈現(xiàn)HTML響應給客戶端是,它負責顯式傳遞給View模板所有需要的數(shù)據(jù)。View模板從不執(zhí)行任何數(shù)據(jù)查詢或應用程序邏輯 – 僅僅負責呈現(xiàn)Model或Controller傳遞過來的數(shù)據(jù)。 當需要從Controller傳遞不止一個Model對象 時,就要用到ViewData 字典或ViewModel 模式。例如,當我們需要Controller在View呈現(xiàn)Dinner對象和支持的Countries列表的時候,采用如下兩種方式來實現(xiàn)。
使用ViewData? 字典 Controller基類公開了一個ViewData 字典屬性,用來從Controllers傳遞額外的數(shù)據(jù)給Views視圖。 ???? Controller中代碼
view source print? 2 public ActionResult Edit(int id)
4 ????Dinner dinner = dinnerRepository.GetDinner(id);
5 ?????ViewData["Countries" ] = new SelectList(PhoneValidator.Countries, dinner.Country);
6 ????return View(dinner);
??? 上面代碼中SelectList構造函數(shù)的第一個參數(shù)顯示國家列表,第二個參數(shù)指定當前選中的國家。???? ??? View中代碼 ? view source print? 1 <%= Html.DropDownList("Country" , ViewData["Countries" ] as SelectList)%>
??? 上面代碼中第一個參數(shù)表示輸出的HTML表單元素名稱,第二個參數(shù)是通過ViewData傳遞的模型類。 ???使用ViewModel模式: ??? ViewData的優(yōu)點:非常快,容易實現(xiàn) ??? ViewData的缺點:輸入錯誤會導致錯誤;不能在編譯期發(fā)現(xiàn)錯誤原因;在View視圖模板中使用強類型時,ViewData要用as來轉(zhuǎn)換。 ??? ViewModel模式:??? 1.針對特定的View視圖創(chuàng)建強類型的類 ??? 2.公開View模板需要的動態(tài)參數(shù)值或內(nèi)容 ??? 3.Controller類填充和傳遞這些類給View模板去用 ??? 4.優(yōu)點:類型安全、編譯期檢查和編輯器的智能提示 ??? 示例代碼: view source print? 01 public class DinnerFormViewModel
03 ???????public Dinner Dinner {get ; private set ;}
04 ????????public SelectList Countries{get ; private set ;}
05 ???????public DinnerFormViewModel(Dinner dinner)
07 ????????????Dinner = dinner;
08 ????????????Countries = new SelectList(PhoneValidator.Countries,dinner.Country);
?
??? 在Controller類中
view source print? 2 public ActionResult Edit(int id)
4 ????Dinner dinner = dinnerRepository.GetDinner(id);
5 ????return View(new DinnerFormViewModel(dinner));
??? 在View視圖模板中 ??? 頭部Inherits = "System.Web.Mvc.ViewPage<NerdDinner.Models.Dinner>"改為 ????Inherits = "System.Web.Mvc.ViewPage<NerdDinner.Controllers.DinnerFormViewModel>" ??? 綁定列表即為<% = Html.DropDownList("Country".Model.Countries) %> ?
下面我們需要更新視圖中的代碼。對于表單中的HTML元素的名稱不需要更新,仍舊保持為Title、Country等等,我們需要更新HTML輔助方法,使用DinnerFormViewModel類來獲取屬性值。 view source print? 02 <label for ="Title" >Dinner Title:</label>
03 <%= Html.TextBox("Title" , Model.Dinner.Title) %>
04 <%= Html.ValidationMessage("Title" , "*" ) %>
07 <label for ="Country" >Country:</label>
08 <%= Html.DropDownList("Country" , Model.Countries) %>
09 <%= Html.ValidationMessage("Country" , "*" ) %>
同樣地,我們也需要更新Edit Post方法,在產(chǎn)生錯誤時,使用DinnerFormViewModel類傳遞給視圖模板: view source print? 02 // POST: /Dinners/Edit/5
04 AcceptVerbs(HttpVerbs.Post)]
05 public ActionResult Edit(int id, FormCollection collection) {
06 Dinner dinner = dinnerRepository.GetDinner(id);
09 dinnerRepository.Save();
10 return RedirectToAction("Details" , new { id=dinner.DinnerID });
13 ModelState.AddModelErrors(dinner.GetRuleViolations());
14 return View(new DinnerFormViewModel(dinner));
我們也更新Create() Action方法,重用相同的DinnerFormViewModel類,在View中實現(xiàn)Country下拉列表框。下面是HTTP-GET的實現(xiàn)代碼: view source print? 3 public ActionResult Create() {
4 Dinner dinner = new Dinner() {
5 EventDate = DateTime.Now.AddDays(7)
7 return View(new DinnerFormViewModel(dinner));
下面是HTTP-POST Create方法的實現(xiàn)代碼: view source print? 02 // POST: /Dinners/Create
03 [AcceptVerbs(HttpVerbs.Post)]
04 public ActionResult Create(Dinner dinner) {
05 if (ModelState.IsValid) {
07 dinner.HostedBy = "SomeUser" ;
08 dinnerRepository.Add(dinner);
09 dinnerRepository.Save();
10 return RedirectToAction("Details" , new { id=dinner.DinnerID });
13 ModelState.AddModelErrors(dinner.GetRuleViolations());
16 return View(new DinnerFormViewModel(dinner));
定制ViewModel 類(Custom-shaped ViewModel Classes ) 在上面的實現(xiàn)方案中,DinnerFormViewModel類直接公開了2個公有屬性:Dinner 模型對象和SelectList模型屬性。這一方法適合于View模板中HTML用戶界面元素和業(yè)務Model對象比較接近的場景。 如果不符合這一情況,可以考慮創(chuàng)建定制的ViewModel類,根據(jù)視圖的使用情況創(chuàng)建優(yōu)化的對象模型 – 該對象模型可能完全不同于底層的業(yè)務模型對象(Domain Model Object)。例如,該ViewModel類有可能公開不同的屬性或者從多個Model對象中匯總的屬性。 定制的ViewModel類不僅可用來從Controller傳遞數(shù)據(jù)到View去呈現(xiàn),而且可用來處理從表單提交回來給Controller的action方法的數(shù)據(jù)。針對后一種情況,你可以讓Action方法根據(jù)表單提交回來的數(shù)據(jù)更新ViewModel對象,接著使用ViewModel實例來映射或者獲取時間的業(yè)務模型對象(Domain Model Object)。 定制ViewModel類提供了很好的靈活性,在任何時候,你發(fā)現(xiàn)View模板中的呈現(xiàn)代碼或Action方法中表單提交代碼越來越開始復雜時,你可以考慮使用定制的ViewModel了。通常,這意味著業(yè)務模型對象和View視圖中的用戶界面元素不一致,一個中介的定制ViewModel類就可以發(fā)揮作用了。
MVC模式還有很多妙用,以后還會寫更多有關MVC的文章。
?
轉(zhuǎn)載于:https://www.cnblogs.com/fcsh820/archive/2010/08/22/1805767.html
創(chuàng)作挑戰(zhàn)賽 新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎
總結
以上是生活随笔 為你收集整理的(转)MVC模式参数传递的探究 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。