zoukankan      html  css  js  c++  java
  • ASP.NET MVC 传值方法ViewData与ViewBag的区别

    一、介绍

    在Asp.net MVC 3 web应用程序中,我们会用到ViewDataViewBag,对比一下: 

    ViewData ViewBag
    它是Key/Value字典集合 它是dynamic类型对像
    从Asp.net MVC 1 就有了 ASP.NET MVC3 才有
    基于Asp.net 3.5 framework 基于Asp.net 4.0与.net framework
    ViewData比ViewBag快 ViewBag比ViewData慢
    在ViewPage中查询数据时需要转换合适的类型 在ViewPage中查询数据时不需要类型转换
    有一些类型转换代码 可读性更好

    二、使用说明

    1、在Controllers中设置值

    1 public ActionResult Index()
    2         {
    3             ViewBag.name = "webapi";        //设置值
    4             ViewData["name"] = "webapi";    //设置值
    5             return View();
    6         }

    2、在Views中获取值

    1 @{
    2     ViewBag.Title = "asp.net mvc";
    3 }
    4 <h2>测试</h2>
    5 
    6 @ViewBag.name
    7 
    8 @ViewData["name"]

     三、对比

    通过定义我们可以看出ViewBag 是ViewData的动态封装器,相当于在ViewData的基础上进行了封装处理

    ViewData与ViewBag的区别

    1、ViewData是字典类型,赋值方式用字典方式,通过key值读取对应的value,ViewData["myName"]
    2、ViewBag是动态类型,使用时直接添加属性赋值即可ViewBag.myName
    3、ViewBag和ViewData只在当前Action中有效,等同于View
    4、ViewData和ViewBag中的值可以互相访问,因为ViewBag的实现中包含了ViewData

    注意:

    1,只有当要访问的关键字是一个有效的C#标识符时,ViewBag 才起作用。 
    例如,如果在ViewData["Key With Spaces"]中存放一个值,那么就不能使用ViewBag访问。因为这样根本就无法通过编译。
    2,动态值不能作为一个参数传递给扩展方法。因为C#编译器为了选择正确的扩展方法,在编译时必须知道每一个参数的真正类型。如果其中任何一个参数是动态的,那么就不会通过编译。
    例如,这行代码就会编译失败:@Html.TextBox("name",ViewBag.Name)。要使这行代码通过编译有两种方法:第一是使用ViewData["Name"],第二是把ViewBag.Name值转换为一个具体的型:(string)ViewBag.Name

  • 相关阅读:
    C#基本数据类型
    ASP.NET MVC 实现二级域名
    asp.net下通过泛解析和伪静态实现二级域名的实现方法
    Web Forms vs Web MVC
    WebForm页面生命周期及asp.net运行机制
    波函数坍缩
    whoami
    wstngfw中使用虚拟IP映射内网IP
    Thread-specific data(TSD)线程私有数据
    Libev库学习
  • 原文地址:https://www.cnblogs.com/webapi/p/5669035.html
Copyright © 2011-2022 走看看