zoukankan      html  css  js  c++  java
  • ASP.NET MVC 学习笔记-5.Controller与View的数据传递

    ViewData属性

      ViewData属性是System.Web.Mvc.ControllerBase中的一个属性,它相当于一个数据字典。Controller中向该字典写入数据,ViewData[“Key”]=data;View中从该字典中获取数据 int data=ViewData[“Key”]。从ViewData中获取到的数据是object类型,必须强制类型转换。

    1 //  
    2 // 摘要:  Gets or sets the dictionary for view data.  
    3 // 返回结果:  The dictionary for the view data.  
    4 public ViewDataDictionary ViewData { get; set; } 

    ViewBag属性

    C# 4.0中才提出的ViewBag,在ViewData上引入了动态特性,算是ViewData的语法糖。

    ViewData

    ViewBag

    Key/Value字典集合

    Dynamic类型对象

    比ViewBag读取速度快

    比ViewData读取数据慢

    需要强制类型转换

    不需要强制类型转换

    1 //  
    2 // 摘要:  Gets the dynamic view data dictionary.    
    3 // 返回结果:  The dynamic view data dictionary.  
    4 [Dynamic]  
    5 public dynamic ViewBag { get; } 

      实际项目中,使用ViewData和ViewBag在Controller与View中进行数据传递,并不是最佳选择,主要有以下缺点:

    1.         性能问题

    ViewData中的值都是对象类型,使用之前必须强制转化为需要的类型,增加了额外的性能消耗。

    2.         类型不安全

    没有类型不安全就不会出现编译错误,调用时转换为其他类型,就会报出运行时错误,良好的编程经验告诉我们,错误最好在编译时铺货。

    3.         破坏了Controller与View的松散耦合

    MVC模式中,Controller和View是松散耦合的,即Controller不知道View的变化,View也不知道Controller的变化,但是,当使用ViewData或ViewBag进行值传递时,就需要知道写入的是什么值,从而破坏了这种松散的关系。

    强类型View方式

      ViewData和ViewBag所出现的问题的关键就是数据类型,因此,如果在Controlle和View之间将数据类型固定,所出现的问题就会得到解决。

      View方式,是使用Controller基类中的View方法进行值传递。

      使用方式为:

    1. Controller返回值,将返回的值作为View()的参数。
    2. View视图中,在代码顶部需要添加代码 @model 返回值的数据类型
    3. View代码中,就可以使用@Model方式来使用返回数据。

    Ps:视图顶部添加代码,数据类型必须是全命名空间。也可以在Web.config文件中添加以下命名空间的配置,就可以省略命名空间的信息,只需要添加类名称即可。

    1 <system.web.webPages.razor>
    2     <pages pageBaseType=”…..”>
    3         <namespace>
    4              <add namespace=”…..”>
    5                  ……
    6         </namespace>
    7     <pages>
    8 </system.web.webPages.razor>        

    View延伸

    MVC模式中,M是数据模型,负责业务逻辑,一般都对应着数据库模型,V是数据视图,仅仅是数据展示,不包含数据逻辑。而在使用View()方式传递数据时,将数据模型直接通过Controller传递给View,在一些情况下可能会违反MVC的体系架构规则。

    为避免出现类似问题,解决方案是在Model和View中添加一层ViewModel,用来负责在两者间进行数据传递。Controller将Model中数据封装成ViewModel,View根据ViewModel直接展示数据,不处理数据逻辑。

  • 相关阅读:
    改变Edit的光标(使用CreateCaret,ShowCaret和LoadBitmap三个API函数)
    浅析Delphi Container库(有开源的DCLX)
    Delphi接口的底层实现(接口在内存中仍然有其布局,它依附在对象的内存空间中,有汇编解释)——接口的内存结构图,简单清楚,深刻 good
    Asp.Net在多线程环境下的状态存储问题
    C#程序中注释过多的8条理由
    CentOS 6.4 编译安装LLVM3.3,Clang和Libc++
    Microsoft 2013校园招聘笔试题及解答
    代码契约CodeContract(八)
    T-SQL 临时表、表变量、UNION
    BST&AVL&红黑树简单介绍
  • 原文地址:https://www.cnblogs.com/DreamOfLife/p/9005345.html
Copyright © 2011-2022 走看看