一步步学习ASP.NET MVC3 (5)——View从Action中获得数据
请注明转载地址:http://www.cnblogs.com/arhat
在上一章中,我们把Razor的模板技术给大家介绍了一下,当然模板中还有其他的知识点,这个以后我们还会继续讲解。本章我们主要讨论一下View如何从Action中取得数据。可以说本章所讲的知识起到了一个承上启下的作用,因为Action负责传递数据,View负责显示数据,那么问题就是Action如何把数据传递给View了呢?这就是本章的主要内容。
Action把数据传递给View主要有两种方式,一种是“使用弱类型”,一种是“使用强类型”,其实两者的主要差别就是看在View中的声明方式。老魏认为使用“强类型”比较好,一是可以使用VS提供的智能提示加快开发效率,二是强类型不容易犯错。那么下面我们看看是如何实现的。那么View从Action接受数据的方式可以从ViewData,ViewBag或TempData取得(关于这三个属性,我们在后面的章节中将重点讲解,本章只要学会用就可以了)。
首先,我们可以使用上一章的项目,也可以新建一个项目。这里我使用了上一章的项目。那么,我们先在Models文件夹中创建一个类”M_Person”。内容如下:
public class M_Person
{
public string Name { get; set; }
public int Age { get; set; }
}
改写HomeControlller的Index方法:
public ActionResult Index()
{
Models.M_Person person = new Models.M_Person() { Name = "济公活佛", Age = };
ViewData.Model = person;
return View();
}
这里我们使用了ViewData来传递数据,把数据放到了ViewData.Model属性中。ViewData.Model是object类型。此时,打开我们的Index.cshtml页面,把数据取出并显示出来。代码如下:
<div>
这是从ViewData.Model中取出的数据 @ViewData.Model.Name
</div>
我们从浏览器中看到的结果是正确的。但是我们在书写@ViewData.Model.Name的时候,VS没有给我们Name的提示。但是却没有出错,原因是在ASP.NET MVC 中使用了”动态表达式”。那么这样的话,在书写属性的时候很容易出错。大家可以看出,我们在Index.cshtml中并没有声明任何的说明,那么这样的方式就是弱类型。
如果要使用强类型,那么需要在Index.cshtml中声明Model的类型。怎么声明呢?我们通过Razor提供额@model指令来指示,注意这里的@model是小写,千万不能写成@Model。好,我们来改一下代码:
@model Com.ArHat.Web.Models.M_Person
<div>
这是从ViewData.Model中取出的数据 @ViewData.Model.Name
</div>
那么我们在写属性的时候VS给了我们提示,非常的方便。

从上面的例子可以看出,无论使用“弱类型”还是“强类型”都可以正确的拿到数据,当然这里老魏推荐使用“强类型”。注意了,@model指令一般和ViewData.Mode一起使用。
刚才给大家演示了使用ViewData.Model来传递数据,当然还可以使用ViewData的索引来传递数据。我们把Index方法更改一下:
public ActionResult Index()
{
Models.M_Person person = new Models.M_Person() { Name = "济公活佛", Age = };
//ViewBag.Data = person;
ViewData["data"] = person;
return View();
}
通过ViewData的索引可以自定义键名和值。当我们把数据放到了ViewData[“data”]中了,在Index.cshtml页面如何把数据拿出来呢?
@using Com.ArHat.Web.Models;
@{var p = ViewData["data"] as M_Person;}
<div>
这是从ViewData["data"]中取出的数据 @p.Name
</div>
大家会发现,写法和先前的写法有所不同了,@model属性只能针对ViewData.Model属性,而这里使用索引的话,那么任何值都是作为object来传递的。所以,我们要在页面中使用@using来导入类型的命名空间,同时还要把数据强制的转换为对应的类型,才能把数据取出来。
下面我介绍一下ViewBag属性来传递属性,老魏比较喜欢这个传值方式,完全是动态的化的,其实主要依赖于.net 4.0 中 dynamic的功能,好了,我们来看一下,还是改写一下Index方法。
public ActionResult Index()
{
Models.M_Person person = new Models.M_Person() { Name = "济公活佛", Age = };
//ViewBag.Data = person;
//ViewData["data"] = person;
ViewBag.Data = person;
return View();
}
ViewBag本身没有Data属性,这个属性是我们自己加上去的,其实就等于ViewData[“data”]。那么同样改写一下Index.cshtml
<div> 这是从ViewBag.Data中取出的数据 @ViewBag.Data.Name </div>
同样是在页面没有使用@model,@using但是我们却取出了数据,这也是“弱类型”的取值方式。当然如果我们也可以使用强类型,只要在Index.cshtml中声明@using Com.ArHat.Web.Models。
@using Com.ArHat.Web.Models;
@{var p = ViewBag.Data as M_Person;}
<div>
这是从ViewBag.Data中取出的数据 @p.Name
</div>
到此,我们介绍了Action如何把数据传递给View,而View又如何获取数据的。至于TempData我们将在后面的章节中来讲解。
下面的内容是联系内容,主要是来练习一下Razor对数据的处理。
我们改写一下Index方法,创建一个List<Models.M_Person>集合,然后我们在Index.cshtml中展示出这个集合中的元素。
public ActionResult Index()
{
List<Models.M_Person> list = new List<Models.M_Person>() {
new Models.M_Person() { Name = "济公活佛", Age = },
new Models.M_Person() { Name = "广亮和尚", Age = },
new Models.M_Person() { Name = "怄气禅师", Age = },
new Models.M_Person() { Name = "飞龙僧", Age = }
};
//ViewBag.Data = person;
//ViewData["data"] = person;
ViewBag.Data = list;
return View();
}
同时更改一下Index.cshtml文件。
@using Com.ArHat.Web.Models;
@foreach (M_Person person in ViewBag.Data) {
<div style="margin-top:10px">和尚:@(person.Name),年龄:@(person.Age)</div>
}
预览一下效果。 
非常简单吧,学习ASP.NET MVC是一件非常简单快乐事。呵呵,下一节,我们继续关注Razor的高级应用!
一步步学习ASP.NET MVC3 (5)——View从Action中获得数据的更多相关文章
- 一步步学习ASP.NET MVC3 章节总结
请注明转载地址:http://www.cnblogs.com/arhat 对于<一步步学习ASP.NET MVC3>系列工15章,那么为了方便大家能够快速的预览,老魏在这里为这个系列提供一 ...
- 一步步学习ASP.NET MVC3 (1)——基础知识
请注明转载地址:http://www.cnblogs.com/arhat 首先在这里我想声明一下,这个ASP.NET MVC3系列是我在授课过程中的一些经验,有什么不对的地方,请大家指出,我们共同的学 ...
- 一步步学习ASP.NET MVC3 (3)——Razor(1)
请注明转载地址:http://www.cnblogs.com/arhat 首先这个<一步步学习ASP.NET MVC3>前段时间有些忙,没有顾得上写文章,昨天呢写了3个和ASP.NET的相 ...
- 一步步学习ASP.NET MVC3 (12)——FileResult
请注明转载地址:http://www.cnblogs.com/arhat 忙了两天,本来老魏昨天就应该写出新的文章,但是由于昨天雨夹雪而且加上昨天晚上加了班,到家都没饭吃了,一看时间都9点了,什么饭店 ...
- 一步步学习ASP.NET MVC3 (6)——@helper,@functions
请注明转载地址:http://www.cnblogs.com/arhat 在前一章中,我们讲述了View如何从Action中获得数据,并显示出来,但随着需求的变化,我们可能要对View中显示的数据作出 ...
- 一步步学习ASP.NET MVC3 (2)——入门程序
请注明转载地址:http://www.cnblogs.com/arhat 在上一节中,我们只是简单的介绍了什么是MVC及MVC的运行原理.而本节呢,主要来实现下一ASP.NET MVC3的开发流程,并 ...
- 一步步学习ASP.NET MVC3 (14)——Route路由
请注明转载地址:http://www.cnblogs.com/arhat 由于今天是星期六,所以多写几篇,感觉前几天的忙碌没有及时发布文章,趁着周末老魏尽力的多写几篇文章.因为本系列基本上快结束了,所 ...
- 一步步学习ASP.NET MVC3 (7)——Controller,Action,ActionResult
请注明转载地址:http://www.cnblogs.com/arhat 前面几章我们讲解的都是关于View方面的知识,虽然还有很多关于View的知识没有讲,但是没关系,我们在后面使用到的时候在讲解, ...
- 一步步学习ASP.NET MVC3 (4)——Razor(2)
请注明转载地址:http://www.cnblogs.com/arhat 在上一章,我们介绍了Razor的一些基本语法,从Razor中我们可以出ASP.NET MVC的视图引擎给我们带来的便利,但是同 ...
随机推荐
- [转]在BBB启动时自动加载dtbo(或执行脚本、运行程序)
启动时自动加载dtbo,实际上就是做了一个cape.官方推荐的方法是用eeprom来实现,请参考我的博文<为BBB制作专属自己的cape(一)>和<为BBB制作专属自己的cape(四 ...
- CI框架中自定义view文件夹位置
要想自定义view文件夹的位置,首先要了解CI框架时如何加载view文件夹的. CI中默认调用view的方法是: $this->load->view(); //这一行代码的原理是什么呢?请 ...
- WebSocket原理及与http1.0/1.1 long poll和 ajax轮询的区别【转自知乎】
一.WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)首先HTTP有1.1和1.0之说,也就是所谓的ke ...
- javascript开发中的封装模式(转)
var bgAuido={ audio : pingfan.$$('audio'), audioBtn : pingfan.$$('audioBtn'), init : function(){ var ...
- 服务端缓存HttpRuntime.Cache的使用
HttpRuntime.Cache.Insert("缓存key", "缓存content", null, DateTime.Now.AddMinutes(3), ...
- apk 反编译记录
反编译资源文件 工具:apktool 使用命令:java -jar apktool.jar d test.apk apktool官网下载地址:github 反编译classes.dex文件 工具:de ...
- ### Theano
Theano. #@author: gr #@date: 2014-07-02 #@email: forgerui@gmail.com 一.安装Theano ubuntu下安装相对简单. 安装依赖: ...
- 移动前端开发之viewport的深入理解(转载)
本文为转载文章,原文网址:http://www.cnblogs.com/2050/p/3877280.html 在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewport了,只有 ...
- 鼠标点击input时,placeholder中的提示信息消失
html代码: <input type="text" placeholder="多个关键词空格隔开"> 鼠标点击input时,placeholder ...
- intellij idea社区版 & maven & git & tomcat/jetty 的struts2项目的搭建
1.新建一个project,并在project下新建一个maven module.