日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

(转)MVC模式参数传递的探究

發布時間:2023/11/30 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (转)MVC模式参数传递的探究 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文地址:http://www.cnblogs.com/dingding3/archive/2010/08/21/MVC.html

最近公司一直在用MVC模式寫程序,所以最近一直再查MVC的資料,目前在研究MVC的參數傳遞方法,因此有了此文。 MVC模式既可以通過Model傳遞參數,也可以用ViewData來保存數據,兩種方式的組合傳遞參數就是一種新的模式了。 使用這種組合傳參的新模式可以非常快的實現,但美中不足的是輸入錯誤會導致錯誤,不能在編譯時發現錯誤原因,而且ViewData必須要用as來轉換。 從Controller傳遞數據到View視圖模板 MVC模式一個典型的特征是嚴格的功能隔離。Model模型、Controller控制器和View視圖各自定義了作用和職責,且相互之間以定義好的方式進行溝通。這有助于提升測試性和代碼重用。 當Controller決定呈現HTML響應給客戶端是,它負責顯式傳遞給View模板所有需要的數據。View模板從不執行任何數據查詢或應用程序邏輯 – 僅僅負責呈現Model或Controller傳遞過來的數據。

當需要從Controller傳遞不止一個Model對象時,就要用到ViewData字典或ViewModel模式。例如,當我們需要Controller在View呈現Dinner對象和支持的Countries列表的時候,采用如下兩種方式來實現。

使用ViewData?字典

Controller基類公開了一個ViewData 字典屬性,用來從Controllers傳遞額外的數據給Views視圖。
???? Controller中代碼

view source print?
1[Authorize]
2public ActionResult Edit(int id)
3{
4????Dinner dinner = dinnerRepository.GetDinner(id);
5?????ViewData["Countries"] = new SelectList(PhoneValidator.Countries, dinner.Country);
6????return View(dinner);
7}

??? 上面代碼中SelectList構造函數的第一個參數顯示國家列表,第二個參數指定當前選中的國家。????
??? View中代碼
? view source print?
1<%= Html.DropDownList("Country", ViewData["Countries"] as SelectList)%>

??? 上面代碼中第一個參數表示輸出的HTML表單元素名稱,第二個參數是通過ViewData傳遞的模型類。
???使用ViewModel模式:
??? ViewData的優點:非常快,容易實現
??? ViewData的缺點:輸入錯誤會導致錯誤;不能在編譯期發現錯誤原因;在View視圖模板中使用強類型時,ViewData要用as來轉換。
??? ViewModel模式:
??? 1.針對特定的View視圖創建強類型的類
??? 2.公開View模板需要的動態參數值或內容
??? 3.Controller類填充和傳遞這些類給View模板去用
??? 4.優點:類型安全、編譯期檢查和編輯器的智能提示

??? 示例代碼: view source print?
01public class DinnerFormViewModel
02{
03???????public Dinner Dinner {get; private set;}
04????????public SelectList Countries{get; private set;}
05???????public DinnerFormViewModel(Dinner dinner)
06???????{
07????????????Dinner = dinner;
08????????????Countries = new SelectList(PhoneValidator.Countries,dinner.Country);
09???????}
10}

?

??? 在Controller類中

view source print?
1[Authorize]
2public ActionResult Edit(int id)
3{
4????Dinner dinner = dinnerRepository.GetDinner(id);
5????return View(new DinnerFormViewModel(dinner));
6}

??? 在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?
01<p>
02<label for="Title">Dinner Title:</label>
03<%= Html.TextBox("Title", Model.Dinner.Title) %>
04<%= Html.ValidationMessage("Title", "*") %>
05</p>
06<p>
07<label for="Country">Country:</label>
08<%= Html.DropDownList("Country", Model.Countries) %>
09<%= Html.ValidationMessage("Country", "*") %>
10</p>
同樣地,我們也需要更新Edit Post方法,在產生錯誤時,使用DinnerFormViewModel類傳遞給視圖模板: view source print?
01//
02// POST: /Dinners/Edit/5
03[
04AcceptVerbs(HttpVerbs.Post)]
05public ActionResult Edit(int id, FormCollection collection) {
06Dinner dinner = dinnerRepository.GetDinner(id);
07try {
08UpdateModel(dinner);
09dinnerRepository.Save();
10return RedirectToAction("Details", new { id=dinner.DinnerID });
11}
12catch {
13ModelState.AddModelErrors(dinner.GetRuleViolations());
14return View(new DinnerFormViewModel(dinner));
15}
16}
我們也更新Create() Action方法,重用相同的DinnerFormViewModel類,在View中實現Country下拉列表框。下面是HTTP-GET的實現代碼: view source print?
1//
2// GET: /Dinners/Create
3public ActionResult Create() {
4Dinner dinner = new Dinner() {
5EventDate = DateTime.Now.AddDays(7)
6};
7return View(new DinnerFormViewModel(dinner));
8}
下面是HTTP-POST Create方法的實現代碼: view source print?
01//
02// POST: /Dinners/Create
03[AcceptVerbs(HttpVerbs.Post)]
04public ActionResult Create(Dinner dinner) {
05if (ModelState.IsValid) {
06try {
07dinner.HostedBy = "SomeUser";
08dinnerRepository.Add(dinner);
09dinnerRepository.Save();
10return RedirectToAction("Details", new { id=dinner.DinnerID });
11}
12catch {
13ModelState.AddModelErrors(dinner.GetRuleViolations());
14}
15}
16return View(new DinnerFormViewModel(dinner));
17}
定制ViewModel類(Custom-shaped ViewModel Classes 在上面的實現方案中,DinnerFormViewModel類直接公開了2個公有屬性:Dinner 模型對象和SelectList模型屬性。這一方法適合于View模板中HTML用戶界面元素和業務Model對象比較接近的場景。 如果不符合這一情況,可以考慮創建定制的ViewModel類,根據視圖的使用情況創建優化的對象模型 – 該對象模型可能完全不同于底層的業務模型對象(Domain Model Object)。例如,該ViewModel類有可能公開不同的屬性或者從多個Model對象中匯總的屬性。 定制的ViewModel類不僅可用來從Controller傳遞數據到View去呈現,而且可用來處理從表單提交回來給Controller的action方法的數據。針對后一種情況,你可以讓Action方法根據表單提交回來的數據更新ViewModel對象,接著使用ViewModel實例來映射或者獲取時間的業務模型對象(Domain Model Object)。 定制ViewModel類提供了很好的靈活性,在任何時候,你發現View模板中的呈現代碼或Action方法中表單提交代碼越來越開始復雜時,你可以考慮使用定制的ViewModel了。通常,這意味著業務模型對象和View視圖中的用戶界面元素不一致,一個中介的定制ViewModel類就可以發揮作用了。

MVC模式還有很多妙用,以后還會寫更多有關MVC的文章。

?

轉載于:https://www.cnblogs.com/fcsh820/archive/2010/08/22/1805767.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的(转)MVC模式参数传递的探究的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。