• 控制器向视图传递数据的方法


     关于函数参数的传递方式:

     值传递:只是将参数值copy函数中,因此在函数中无法修改该参数的值。修改的只是传入参数的一份copy.

     引用传递:将参数地址传给函数,因此在函数中能修改该参数的值

    http://blog.csdn.net/sknice/article/details/42323791

    http://www.cnblogs.com/wenjiang/archive/2013/06/07/3123100.html

    使用Model对象

    介绍Razor语法,让我们从Index.cshtml文件的第一行开始:

    @model MvcApplication1.Models.Product

    Razor语句都是以@符号开始的。每个视图都有自己的Model属性(通过@Model调用)。上面这句代码的意思是将本视图的Model属性的类型指向MvcApplication1.Models.Product类型,这就实现了强类型。强类型的好处之一是类型安全,如果写错了Model对象的某个成员名,编译器会报错;另一个好处是在VS中可以使用VS中的代码智能提示自动完成类型成员调用的代码编写。 当然这句代码不要程序也可以正常运行,只是给编写代码造成了一定的困难。

    视图中的Model属性用于存放控制器(Controller)传递过来的model实例对象(本示例中ProductController通过“return View(myProduct)”传递给Index视图),下面的代码演示了如何调用该model对象:

    @model MvcApplication1.Models.Product
    
    @{
        ViewBag.Title = "Index";
    }
    <!-- 调用Product实例的Name属性 -->
    <h2>名称:@Model.Name</h2>

    注意,第一行代码用于声名Model属性类型用的是@model <Model类型名>(小写m),而调用控制器传递过来的Model对象用的是@Model.<属性名>(大写M)。

    1. 使用 ViewData 传递数据

    Controller:ViewData["Name"]="代码里";

    View:@(ViewData["Name"])

    注:只在当前页面访问,无法跨页传递;

    2. 使用TempData传递数据

    Controller:TempData["Name"]="代码里";

    View:@(TempData["Name"])

    注:保存在Session中,可以实现跨页传递,且传递一次之后自动删除(只能使用一次)

    3. 使用Model传递数据

    Controller:Person person=new Person(){Name="代码里"};

    return View(person);

    View:@model Person

    @(Model.Name)

    通过强类型视图直接传递实例化对象

    上一次只讲了上面3种方式,第四种是Co君常用的一种传值方式:ViewBag,经常用给不小心漏掉了,非常抱歉

    4. 使用ViewBag传递数据

    ViewBag是dynamic类型对象,所以使用时不需要进行类型的转换,性能上比ViewData要稍微差一点点,但是应该大多数人都喜欢用ViewBag,不论从书写还是可读性来说,ViewBag都略胜一筹

        

    在"Home" 控制器的Index()动作方法中,设置ViewBag属性值。

    namespace MvcApplication1:Controllers{     public class HomeController:Controller    {        public ActionResult  Index()        {            ViewBag.Name="代码里";            ViewBag.Ads="www.daimali.com";            ViewBag.person=new Person{name="李四",sex="男"};            return View();        }    }}

    示例中我们可以直接通过 【ViewBag.自定义属性】,用法非常方便。

    <html><head></head><body>    站点名称:@(ViewBag.Name)    网站地址:@(ViewBag.Ads)     所属人:@(ViewBag.person.name)     性别:  @(ViewBag.person.sex)</body></html>

    使用时不需要进行类型的转换即可直接调用。同时它和ViewData一样,都只在当前页面访问,无法实现跨页传递。

    TempData也是字典,所以它的使用完全等同于ViewData,但两者之间还是存在很大的差异。

         TempData,顾名思义,就是临时数据。TempData保存在Session中,Controller每次请求的时候都会从Session中获取TempData,然后清除Session。基于这样的事实,在每次请求结束后,TempData的生命周期也就结束了。网上有一句话:TempData至多之只能通过一次Controller传递,假设我们的Controller是跳转到下一个Controller,以此类推,在最后一个Controlle相应的视图上,的确可以获得该TempData。但是,这并不是说TempData已经跨请求传递了,这依然只是一次请求,至于是否是跨Controller传递,我认为不是,所谓的通过Controller传递,是指将TempData传递给View,在上面的例子中,只有最后的Controller才会将该TempData传递给View,所以,TempData的确是只能通过一次Controller传递。

          TempData也可以在Action之间传递的,像是这样:

    复制代码
    public ActionResult Index()
    {
        TempData["message"] = "Hello";
        return View();
    }
    
    public ActionResult About()
    {
        if ("Hello" == TempData["message"] as string)
        {
             TempData["message"] = "Hello,Word";
        }
        return View();
    }
    复制代码

          但必须注意,要使该行为正确,也就是TempData能够被传递给另一个Action,Index操作对应的视图就不能使用TempData,因为一旦使用就相当于一次请求,那么TempData中的值就会被清空。

          TempData是存储在Session中,但这个并不是绝对的,我们可以改变TempData的存储地方,只要实现ITempDataProvider这个接口就行,但一般情况没有必要这么做。 

  • 相关阅读:
    [ 转载 ] Java基础4--Java中的static关键字解析
    [ 原创 ]新手作品-我的第一款安卓自学作品---YY音乐诞生了
    [ 转载 ]学习笔记-svn用法详解
    [ 原创 ]学习笔记-Android 学习笔记 Contacts (一)ContentResolver query 参数详解 [转载]
    [ 原创 ]学习笔记-Android 中关于Cursor类的介绍
    《JavaScript DOM 编程艺术 第 2 版》
    test-ra
    2019-4-22
    《写给大家看的设计书》
    2018-5
  • 原文地址:https://www.cnblogs.com/ecollab/p/6158671.html
Copyright © 2020-2023  润新知