MVC 向頁面傳值方式總結


總結發現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(); 

}

你和上面的對比 你看見了不同嗎?

 
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                                                                                    

我們可以認為 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>

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM