请注明转载地址: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中获得数据的更多相关文章

  1. 一步步学习ASP.NET MVC3 章节总结

    请注明转载地址:http://www.cnblogs.com/arhat 对于<一步步学习ASP.NET MVC3>系列工15章,那么为了方便大家能够快速的预览,老魏在这里为这个系列提供一 ...

  2. 一步步学习ASP.NET MVC3 (1)——基础知识

    请注明转载地址:http://www.cnblogs.com/arhat 首先在这里我想声明一下,这个ASP.NET MVC3系列是我在授课过程中的一些经验,有什么不对的地方,请大家指出,我们共同的学 ...

  3. 一步步学习ASP.NET MVC3 (3)——Razor(1)

    请注明转载地址:http://www.cnblogs.com/arhat 首先这个<一步步学习ASP.NET MVC3>前段时间有些忙,没有顾得上写文章,昨天呢写了3个和ASP.NET的相 ...

  4. 一步步学习ASP.NET MVC3 (12)——FileResult

    请注明转载地址:http://www.cnblogs.com/arhat 忙了两天,本来老魏昨天就应该写出新的文章,但是由于昨天雨夹雪而且加上昨天晚上加了班,到家都没饭吃了,一看时间都9点了,什么饭店 ...

  5. 一步步学习ASP.NET MVC3 (6)——@helper,@functions

    请注明转载地址:http://www.cnblogs.com/arhat 在前一章中,我们讲述了View如何从Action中获得数据,并显示出来,但随着需求的变化,我们可能要对View中显示的数据作出 ...

  6. 一步步学习ASP.NET MVC3 (2)——入门程序

    请注明转载地址:http://www.cnblogs.com/arhat 在上一节中,我们只是简单的介绍了什么是MVC及MVC的运行原理.而本节呢,主要来实现下一ASP.NET MVC3的开发流程,并 ...

  7. 一步步学习ASP.NET MVC3 (14)——Route路由

    请注明转载地址:http://www.cnblogs.com/arhat 由于今天是星期六,所以多写几篇,感觉前几天的忙碌没有及时发布文章,趁着周末老魏尽力的多写几篇文章.因为本系列基本上快结束了,所 ...

  8. 一步步学习ASP.NET MVC3 (7)——Controller,Action,ActionResult

    请注明转载地址:http://www.cnblogs.com/arhat 前面几章我们讲解的都是关于View方面的知识,虽然还有很多关于View的知识没有讲,但是没关系,我们在后面使用到的时候在讲解, ...

  9. 一步步学习ASP.NET MVC3 (4)——Razor(2)

    请注明转载地址:http://www.cnblogs.com/arhat 在上一章,我们介绍了Razor的一些基本语法,从Razor中我们可以出ASP.NET MVC的视图引擎给我们带来的便利,但是同 ...

随机推荐

  1. 动态修改 C 语言函数的实现

    Objective-C 作为基于 Runtime 的语言,它有非常强大的动态特性,可以在运行期间自省.进行方法调剂.为类增加属性.修改消息转发链路,在代码运行期间通过 Runtime 几乎可以修改 O ...

  2. 自定义控件(视图)1期笔记02:View的绘制流程

    1. 引言: 来自源码的3个方法: (1)public final void measure():测量,用来控制控件的大小,final不建议覆写 (2)public void layout():布局, ...

  3. DHCP服务自动分配IP地址原理

    转载自:http://blog.csdn.net/lycb_gz/article/details/8499559 DHCP在提供服务时,DHCP客户端是以UDP 68号端口进行数据传输的,而DHCP服 ...

  4. S2-020 Struts ClassLoader Manipulation安全限制绕过(CVE-2014-0094)

    受影响系统: Apache Group Struts 2.x 描述: ----------------------------------------------------------------- ...

  5. 深入理解计算机系统第二版习题解答CSAPP 2.15

    只使用位级运算和逻辑运算,编写一个C表达式,它等价于x==y.换句话说,当x和y相等时它将返回1,否则就返回0. !(x ^ y)

  6. 去除ActionBar的方法

    今天做一个播放器项目,由于要去除ActionBar,纠结好久,原来这么简单 记录一下 只需要修改AndroidManifest.xml文件中的主题即可 <application android: ...

  7. Singleton(单例模式)

    类的实例化次数只能一次. 例如:小王和小李通过门铃进行沟通,首先判断小王家是否有门,若没有建立门,若有门直接返回门. var xiaowang = (function(argument){ var m ...

  8. maven打包技巧

    http://www.infoq.com/cn/news/2011/06/xxb-maven-9-package/ "打包"这个词听起来比较土,比较正式的说法应该是"构建 ...

  9. Sql三种分页方法

    --分页三种方法--第一种 ROW_NUMBER() OVER( ORDER BY OrgID) AS indexs 大于pagesize*pageindex,少于等于pagesize*(pagein ...

  10. 百度贴吧图片抓取工具(Python)

    废话不多说,直接上源码. import os,urllib,urllib2,re path='E:/img' #图片保存路径 url=raw_input('Please input URL:')#贴吧 ...