• 一步步学习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 = 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是一件非常简单快乐事。呵呵,下一节,我们继续关注Razor的高级应用!

  • 相关阅读:
    售后返修管理软件流程设计图
    Easyui datagrid加载数据时默认全选的问题
    如何做好售后管理之售后返修品管理
    您需要售后返修管理软件的N个理由
    使用软件量化考核售后维修人员业绩?
    如何使用NET Reactor为您的.Net(C#,VB.Net) 源代码加密!
    VS.Net开发必备,让您的代码自动收缩,如何实现!
    vs生成dll,却没有生成相应的lib
    c++、webServices、gsoap、tinyxml、iconv
    gsoap、c++。webservice的client。
  • 原文地址:https://www.cnblogs.com/arhat/p/3542750.html
Copyright © 2020-2023  润新知