一.ASP.NET MVC中Controller给View传递数据的方式(ViewData,ViewBag,Model)

ViewData

以ViewData[“name”]=“rupeng”;string s=(string)ViewData[“name”]这样键值对的方式进行数据传送。

ViewBag

ViewBag是dynamic类型的参数,是对ViewData一个动态类型封装,用起来更方便,和ViewData共同操作一个数据。ViewBag.name=""; @ViewBag.name。用ViewBag传递数据非常方便,但是因为ASP.Net MVC中的“Html辅助类”等对于ViewBag有一些特殊约定,一不小心就跳坑了,所以尽量不要用ViewBag,而是使用Model,虽然会麻烦“越麻烦工资越高”

Model

可以在Controller中通过return View(model)赋值,然后在cshtml中通过Model属性来访问这个对象;
如果在cshtml中通过“@model 类型”(注意model小写)指定类型,则cshtml中的Model就是指定的强类型的,这样的cshtml叫“强类型视图”;如果没有指定“@model 类型”, 则cshtml中的Model就是dynamic。

二.ASP.NET MVC 传值方法ViewData与ViewBag的区别

介绍

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中设置值
public ActionResult Index()
        {
            ViewBag.name = "webapi";        //设置值
            ViewData["name"] = "webapi";    //设置值
            return View();
        }
  1. 在Views中获取值
@{
    ViewBag.Title = "asp.net mvc";
}
<h2>测试</h2>

@ViewBag.name

@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

posted on 2019-05-11 11:34  豆皮没有豆  阅读(280)  评论(0)    收藏  举报