Controller向View传值方式总结
总结发现ASP.NET MVC中Controller向View传值的方式共有6种,分别是:
首先我们需要明确的是我们从controller向view传值的时候,这些方式分别处于什么样的地位:
我们一般会向页面传递一个主要的类型的数据,一般是情况下是一个List<Model>,如果只有这个,很好办,一个model对象就解决了,但是往往除此之外还会有一些额外的零散的数据需要传递,比如分页的pageIndex,或者pageCount等等,这样的数据用原有的model就无能为力了,这时候,我们就可以用ViewBag、ViewData、TempData来传递这些额外的数据。
ViewBag、ViewData、TempData之间的差别:
ViewData与ViewBag之间非常相似,两者使用的场景基本一致,但是ViewData的类型是很明确的,使用的时候经常需要强制类型转换,而ViewBag的类型是动态的,不确定的,直接就可以使用,他们的传值范围是:controller向view传值,view自己和自己传值。而TempData存在的目的就是为了防止redirect时候数据的丢失,所以它的传值范围是当前controller和跳转后的controller之间。
下面来详细的讲述他们的具体用法:
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的用法示例:
}; 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>
ViewModel
我们可以用一个ViewModel来实现model和其他三个额外传值的对象的职能,具体具体的实现方式,请看另外一篇文章:
http://www.cnblogs.com/key1309/p/3489191.html
本文章总结自:http://bubblogging.wordpress.com/2011/12/31/mvc-data-controller-view/
两篇文章