请注明转载地址: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的高级应用!

最新文章

  1. 解决IDEA中Maven加载依赖包慢的问题
  2. Codeforces Round #347 (Div. 2) (练习)
  3. 【Openlayers3】在地图上添加highcharts图表
  4. 伪集群zookeeper模式下codis的部署安装
  5. java传值和通过引用传递
  6. java基础IO流综合加习题
  7. javascript ES3小测试
  8. iOS内购(IAP)中的那些坑
  9. Mac中Eclipse安装和使用svn
  10. 项目总结2——mybatis配置的理解
  11. 第 9 章 数据管理 - 077 - 跨主机使用 Rex-Ray volume
  12. wap2app(九)-- 使用mui.previewImage之后,页面a链接不能跳转
  13. Prometheus-自定义Node_Exporter
  14. Atitit s2018 s3 doc list alldvc.docx&#160;.docx s2018 s3f doc compc s2018 s3f doc homepc sum doc dvcCompc dtS312 s2018 s3f doc compc\Atitit PathUtil 工具新特性新版本 v8 s312.docx s2018 s3f doc compc\Atitit 操作日
  15. LeetCode 521 Longest Uncommon Subsequence I 解题报告
  16. Ext.net中Combobox如何绑定数据库中的值-通用方法
  17. httpclient接口测试完整用例以及获取信息的方法
  18. JAVA面试题整理(5)-数据库
  19. 前端之CSS——CSS选择器
  20. 2014-08-28——移动端,触摸事件 touchstart、touchmove、touchend、touchcancel

热门文章

  1. Java基础知识强化之网络编程笔记15:Android网络通信之 Android异步任务处理(AsyncTask使用)
  2. Android打地鼠游戏源码带道具购买的Android游戏开发
  3. WebGoat视频教程下载
  4. 关于jQuery源码中(function(window,undefined){//dosomething()})(window)写法解释
  5. php中GD库的一些简单使用
  6. FileReader 的了解
  7. 用jsp方式通知客户端下载文件
  8. 点击 a 标签触发事件而不跳转页面
  9. 我的MFC学习之路(一)
  10. Oracle之初始创建scott/tiger来测试