首页 > 代码库 > 控制器向视图传递数据的方法
控制器向视图传递数据的方法
http://blog.csdn.net/sknice/article/details/42323791
http://www.cnblogs.com/wenjiang/archive/2013/06/07/3123100.html
使用Model对象
介绍Razor语法,让我们从Index.cshtml文件的第一行开始:
@model MvcApplication1.Models.Product
Razor语句都是以@符号开始的。每个视图都有自己的Model属性(通过@Model调用)。上面这句代码的意思是将本视图的Model属性的类型指向MvcApplication1.Models.Product类型,这就实现了强类型。强类型的好处之一是类型安全,如果写错了Model对象的某个成员名,编译器会报错;另一个好处是在VS中可以使用VS中的代码智能提示自动完成类型成员调用的代码编写。 当然这句代码不要程序也可以正常运行,只是给编写代码造成了一定的困难。
视图中的Model属性用于存放控制器(Controller)传递过来的model实例对象(本示例中ProductController通过“return View(myProduct)”传递给Index视图),下面的代码演示了如何调用该model对象:
@model MvcApplication1.Models.Product@{ ViewBag.Title = "Index";}<!-- 调用Product实例的Name属性 --><h2>名称:@Model.Name</h2>
注意,第一行代码用于声名Model属性类型用的是@model <Model类型名>(小写m),而调用控制器传递过来的Model对象用的是@Model.<属性名>(大写M)。
1. 使用 ViewData 传递数据
Controller:ViewData["Name"]="代码里";
View:@(ViewData["Name"])
注:只在当前页面访问,无法跨页传递;
2. 使用TempData传递数据
Controller:TempData["Name"]="代码里";
View:@(TempData["Name"])
注:保存在Session中,可以实现跨页传递,且传递一次之后自动删除(只能使用一次)
3. 使用Model传递数据
Controller:Person person=new Person(){Name="代码里"};
return View(person);
View:@model Person
@(Model.Name)
通过强类型视图直接传递实例化对象
上一次只讲了上面3种方式,第四种是Co君常用的一种传值方式:ViewBag,经常用给不小心漏掉了,非常抱歉
4. 使用ViewBag传递数据
ViewBag是dynamic类型对象,所以使用时不需要进行类型的转换,性能上比ViewData要稍微差一点点,但是应该大多数人都喜欢用ViewBag,不论从书写还是可读性来说,ViewBag都略胜一筹
在"Home" 控制器的Index()动作方法中,设置ViewBag属性值。
namespace MvcApplication1:Controllers{ public class HomeController:Controller { public ActionResult Index() { ViewBag.Name="代码里"; ViewBag.Ads="www.daimali.com"; ViewBag.person=new Person{name="李四",sex="男"}; return View(); } }}
示例中我们可以直接通过 【ViewBag.自定义属性】,用法非常方便。
<html><head></head><body> 站点名称:@(ViewBag.Name) 网站地址:@(ViewBag.Ads) 所属人:@(ViewBag.person.name) 性别: @(ViewBag.person.sex)</body></html>
使用时不需要进行类型的转换即可直接调用。同时它和ViewData一样,都只在当前页面访问,无法实现跨页传递。
TempData也是字典,所以它的使用完全等同于ViewData,但两者之间还是存在很大的差异。
TempData,顾名思义,就是临时数据。TempData保存在Session中,Controller每次请求的时候都会从Session中获取TempData,然后清除Session。基于这样的事实,在每次请求结束后,TempData的生命周期也就结束了。网上有一句话:TempData至多之只能通过一次Controller传递,假设我们的Controller是跳转到下一个Controller,以此类推,在最后一个Controlle相应的视图上,的确可以获得该TempData。但是,这并不是说TempData已经跨请求传递了,这依然只是一次请求,至于是否是跨Controller传递,我认为不是,所谓的通过Controller传递,是指将TempData传递给View,在上面的例子中,只有最后的Controller才会将该TempData传递给View,所以,TempData的确是只能通过一次Controller传递。
TempData也可以在Action之间传递的,像是这样:
public ActionResult Index(){ TempData["message"] = "Hello"; return View();}public ActionResult About(){ if ("Hello" == TempData["message"] as string) { TempData["message"] = "Hello,Word"; } return View();}
但必须注意,要使该行为正确,也就是TempData能够被传递给另一个Action,Index操作对应的视图就不能使用TempData,因为一旦使用就相当于一次请求,那么TempData中的值就会被清空。
TempData是存储在Session中,但这个并不是绝对的,我们可以改变TempData的存储地方,只要实现ITempDataProvider这个接口就行,但一般情况没有必要这么做。
控制器向视图传递数据的方法