MVC 向頁面傳值方式總結(2)

總結髮現ASP.NET MVC中Controller向View傳值的方式共有6種,分別是:html

  • ViewBag
  • ViewData
  • TempData
  • 向普通View頁面傳一個Model對象
  • 向強類型頁面傳傳一個Model對象
  • 用一個ViewModel對象解決全部問題

 

     首先咱們須要明確的是咱們從controller向view傳值的時候,這些方式分別處於什麼樣的地位:緩存

     咱們通常會向頁面傳遞一個主要的類型的數據,通常是狀況下是一個List<Model>,若是隻有這個,很好辦,一個model對象就解決了,可是每每除此以外還會有一些額外的零散的數據須要傳遞,好比分頁的pageIndex,或者pageCount等等,這樣的數據用原有的model就無能爲力了,這時候,咱們就能夠用ViewBag、ViewData、TempData來傳遞這些額外的數據。app

     視圖數據能夠經過ViewBag屬性訪問,它主要是爲了從Controller到view進行傳值用的,相似有所使用的ViewData[] 字典類。對於ViewBag是如此的強大,意味着你能動態的set/get 值,增長任何數量的的額外字段而不須要強類型的檢測。如:post

control控制器spa

複製代碼
public ActionResult Index() { List<string> colors = new List<string>(); colors.Add("red"); colors.Add("green"); colors.Add("blue"); ViewData["listColors"] = colors; ViewData["dateNow"] = DateTime.Now; ViewData["name"] = "Hajan"; ViewData["age"] = 25; return View();
複製代碼

 

control 控制器3d

 

複製代碼
public ActionResult Index() { List<string> colors = new List<string>(); colors.Add("red"); colors.Add("green"); colors.Add("blue"); ViewBag.ListColors = colors; //colors is List ViewBag.DateNow = DateTime.Now; ViewBag.Name = "Hajan"; ViewBag.Age = 25; return View(); }
複製代碼

你和上面的對比 你看見了不一樣嗎?code

 
View
對應前臺視圖:

1.使用ViewData

<p>
My name is <b>@ViewData["name"] </b>,
<b>
<br />
I like the following colors:
</p>
<ul id="colors">
@foreach (var color in ViewData["listColors"] as List<string>)
{
<li><font color="@color">@color </font></li>
}
</ul>
<p>
@ViewData["dateNow"]
</p>

2.使用ViewBag

<p>
My name is < b>@ViewBag.Name</b>, <b>@ViewBag.Age</b> years old.
<br />
I like the following colors:
</p>
<ul id="colors">
@foreach (var color in ViewBag.ListColors)
{
<li><font color="@color">@color</font> </li>
}
</ul>
<p>
@ViewBag.DateNow
</p>
效果圖:
 
ViewBag、ViewData 和 TempData 的區別:
ViewData 和 TempData 均可以傳遞弱類型數據,區別以下:
ViewData 只在當前 Action 中有效,生命週期和 View 相同;
TempData 的數據至多隻能通過一次Controller傳遞,而且每一個元素至多隻能被訪問一次,訪問之後,自動被刪除。
TempData 通常用於臨時的緩存內容或拋出錯誤頁面時傳遞錯誤信息,能夠將TempData 在使用以前存儲到相應的 ViewData 中以備循環使用。
 

ViewBag                                                                                    orm

咱們能夠認爲 ViewBag=ViewData+Dynamic wrapper around the ViewData ,接下來你就能夠體會到這個公式的含義了。htm

一、conroller向view傳值對象

 

二、view向view傳值:

 

三、利用ViewBag傳遞一個對象:

 

 

 

ViewData                                                                                  

一、ViewData的基本用法

 

二、ViewData 轉換成 ViewBag:

 

三、ViewBag 轉換成 ViewData:

 

 

 

TempData                                                                                

TempData用於在Redirect的時候保存數據,ViewData、ViewBag在跳轉後就會變成null,可是TempData不會,下面是TempData的用法示例:

 

複製代碼
public ActionResult Index() { var model = new Review() { Body = "Start", Rating=5 }; TempData["ModelName"] = model; return RedirectToAction("About"); } <pre><pre lang="cs">public ActionResult About() { var model= TempData["ModelName"]; return View(model); }
複製代碼

 普通頁面傳遞model: 

複製代碼
//Action代碼 public ActionResult Index() { Product p = new Product(); p.Name = "Toy"; return View(p); } 在View中調用的代碼: Product : <%: ((Product)Model).Name %>
複製代碼

 

向強類型試圖傳遞model                                                             

 一、WebForm Engine的試圖的實現:

複製代碼
//Aciton的代碼 public ActionResult Index() { Product p = new Product(); p.Name = "Toy"; return View(p); } View中的代碼 聲明類型 <%@ Page Inherits="System.Web.Mvc.ViewPage<Product>" %> 直接用Model調用該對象 <h2> Product Name: <%: Model.Name %> </h2>
複製代碼

二、Razor Engine的實現:

在Razor中聲明類型的方式: @model Mvc3App.Models.Product 在Razor中調用對象的方式: <h2> Product: @Model.Name </h2>
相關文章
相關標籤/搜索