總結發現ASP.NET MVC中Controller向View傳值的方式共有6種,分別是:
- ViewBag
- ViewData
- TempData
- 向普通View頁面傳一個Model對象
- 向強類型頁面傳傳一個Model對象
- 用一個ViewModel對象解決所有問題
首先我們需要明確的是我們從controller向view傳值的時候,這些方式分別處於什么樣的地位:
我們一般會向頁面傳遞一個主要的類型的數據,一般是情況下是一個List<Model>,如果只有這個,很好辦,一個model對象就解決了,但是往往除此之外還會有一些額外的零散的數據需要傳遞,比如分頁的pageIndex,或者pageCount等等,這樣的數據用原有的model就無能為力了,這時候,我們就可以用ViewBag、ViewData、TempData來傳遞這些額外的數據。
視圖數據可以通過ViewBag屬性訪問,它主要是為了從Controller到view進行傳值用的,類似有所使用的ViewData[] 字典類。對於ViewBag是如此的強大,意味着你能動態的set/get 值,增加任何數量的的額外字段而不需要強類型的檢測。如:
control控制器
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 控制器
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(); }
你和上面的對比 你看見了不同嗎?
1.使用ViewData
2.使用ViewBag


ViewBag
我們可以認為 ViewBag=ViewData+Dynamic wrapper around the ViewData ,接下來你就可以體會到這個公式的含義了。
1、conroller向view傳值
2、view向view傳值:
3、利用ViewBag傳遞一個對象:
ViewData
1、ViewData的基本用法
2、ViewData 轉換成 ViewBag:
3、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
1、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>
2、Razor Engine的實現:
在Razor中聲明類型的方式: @model Mvc3App.Models.Product 在Razor中調用對象的方式: <h2> Product: @Model.Name </h2>