MVC3之View从Action中获得数据 第五讲

  Action把数据传递给View主要有两种方式,一种是“使用弱类型”,一种是“使用强类型”,其实两者的主要差别就是看在View中的声明方式。老魏认为使用“强类型”比较好,一是可以使用VS提供的智能提示加快开发效率,二是强类型不容易犯错。那么下面我们看看是如何实现的。那么View从Action接受数据的方式可以从ViewData,ViewBagTempData取得(关于这三个属性,我们在后面的章节中将重点讲解,本章只要学会用就可以了)。

  首先,我们可以使用上一章的项目,也可以新建一个项目。这里我使用了上一章的项目。那么,我们先在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 = 90 };

        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给了我们提示,非常的方便。

wps_clip_image-16542

  从上面的例子可以看出,无论使用“弱类型”还是“强类型”都可以正确的拿到数据,当然这里老魏推荐使用“强类型”。注意了,@model指令一般和ViewData.Mode一起使用

  刚才给大家演示了使用ViewData.Model来传递数据,当然还可以使用ViewData的索引来传递数据。我们把Index方法更改一下:

复制代码
public ActionResult Index()
{
  Models.M_Person person = new Models.M_Person() { Name = "济公活佛", Age = 90 };
//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 = 90 };
    //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 = 90 },       new Models.M_Person() { Name = "广亮和尚", Age = 88 },       new Models.M_Person() { Name = "怄气禅师", Age = 45 },       new Models.M_Person() { Name = "飞龙僧", Age = 123 }     };     //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> }
复制代码

预览一下效果。 
wps_clip_image-19150

非常简单吧,学习ASP.NET MVC是一件非常简单快乐事。

原文地址:http://www.cnblogs.com/arhat/p/3542750.html

posted @ 2014-02-13 12:18  杨潇love  阅读(197)  评论(0编辑  收藏  举报