ViewData和ViewBag有什么区别?

use*_*652 325 .net viewdata viewbag asp.net-mvc-3 difference

ViewBag在MVC 3中看到了.ViewData与MVC 2有什么不同?

Dar*_*rov 378

它使用C#4.0动态功能.它实现了与viewdata相同的目标,应该避免使用强类型视图模型(应该避免使用与viewdata相同的方式).

所以基本上它取代了魔术字符串:

ViewData["Foo"]
Run Code Online (Sandbox Code Playgroud)

具有魔力属性:

ViewBag.Foo
Run Code Online (Sandbox Code Playgroud)

你没有编译时的安全性.

我继续责怪微软在MVC中引入这个概念.

属性的名称区分大小写.

  • 我觉得这有点主观.强类型模型很好,雅达亚达,但对于你快速获得视图并运行的场景,ViewBag和类似的工作比Controller,View,Model,AutoMapper到ViewModel等更快. (24认同)
  • @SubinJacob如果你想要答案,你应该提出一个新问题.创建SelectList绝对是制作下拉列表的方法. (14认同)
  • 出于什么目的你要责怪微软?如果没有viewdata我们如何绑定模型中的dropdownlist.(我不认为在模型中使用selectlist会是一个好主意) (11认同)
  • @Darin,为什么你"责备"微软引入这个?它只是一个给开发人员的工具.如果你知道自己在做什么,就可以充分利用它.如果你不喜欢它或者觉得它更容易出错,那就不要使用它.:) (10认同)
  • 您如何建议在部分和布局之间传递数据?当他们看不到全貌时,人们会责备他们.我想你到处都有基本控制器和基本视图模型或静态/单例对象.猜猜是什么,更好地学习使用视图数据并责怪自己使用错误的工具来完成工作. (4认同)
  • 在我的每个.cshtml视图中,我使用ViewBag在布局中设置内容,如body类.例如,假设我有一个帐户页面Account.cshtml.在顶部,我设置ViewBag.BodyClass ="page-account",以便布局生成<body class ="page-account".那有什么不对呢?有没有更好的办法?在这样的场景中,它看起来如此简单和合乎逻辑. (3认同)
  • "你没有编译时的安全性." 它只是Razor视图中的智能感知.如果你有`model.unknown`,项目仍然会编译.然后您的项目将在运行时爆炸.至少在`ViewBag.unknown`中你的视图不会被打破. (2认同)

Ric*_*nco 42

内部ViewBag属性在ViewData字典中存储为名称/值对.

注意:在MVC 3的大多数预发布版本中,ViewBag属性被命名为ViewModel,如MVC 3发行说明中的​​片段中所述:

(编辑10-8-12)有人建议我发布我发布的这个信息的来源,这里是来源:http: //www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4

MVC 2控制器支持ViewData属性,使您可以使用后期绑定字典API将数据传递到视图模板.在MVC 3中,您还可以使用ViewBag属性稍微简单的语法来实现相同的目的.例如,您可以编写ViewBag.Message ="text",而不是编写ViewData ["Message"] ="text".您不需要定义任何强类型类来使用ViewBag属性.因为它是动态属性,所以您只需获取或设置属性,它将在运行时动态解析它们.在内部,ViewBag属性作为名称/值对存储在ViewData字典中.(注意:在MVC 3的大多数预发布版本中,ViewBag属性被命名为ViewModel属性.)


Aru*_*ash 34

ViewBag与MVC中的ViewData

http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html

ViewBag和ViewData之间的相似之处:

从控制器移动到视图时,有助于维护数据.用于将数据从控制器传递到相应的视图.短寿命意味着当重定向发生时,值变为空.这是因为他们的目标是提供一种在控制器和视图之间进行通信的方法.它是服务器调用中的通信机制.

ViewBag和ViewData之间的区别:

ViewData是一个对象字典,它是从ViewDataDictionary类派生的,可以使用字符串作为键访问.ViewBag是一个动态属性,它利用了C#4.0中的新动态功能.ViewData需要对复杂数据类型进行类型转换,并检查空值以避免错误.ViewBag不需要对复杂数据类型进行类型转换.

ViewBag和ViewData示例:

public ActionResult Index()
{   
    ViewBag.Name = "Arun Prakash";   
    return View();
}

public ActionResult Index()
{  
    ViewData["Name"] = "Arun Prakash";  
    return View();
}   
Run Code Online (Sandbox Code Playgroud)

在视野中呼唤

@ViewBag.Name    
@ViewData["Name"]
Run Code Online (Sandbox Code Playgroud)

  • 你的答案表明`类型转换',但你没有显示如何进行类型转换 (5认同)

Nar*_*ani 31

ViewData:它需要对复杂数据类型进行类型转换,并检查空值以避免错误.

ViewBag:它不需要为复杂数据类型进行类型转换.

请考虑以下示例:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var emp = new Employee
        {
            EmpID=101,
            Name = "Deepak",
            Salary = 35000,
            Address = "Delhi"
        };

        ViewData["emp"] = emp;
        ViewBag.Employee = emp;

        return View(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

代码View如下:

@model MyProject.Models.EmpModel;
@{ 
 Layout = "~/Views/Shared/_Layout.cshtml"; 
 ViewBag.Title = "Welcome to Home Page";
 var viewDataEmployee = ViewData["emp"] as Employee; //need type casting
}

<h2>Welcome to Home Page</h2>
This Year Best Employee is!
<h4>@ViewBag.Employee.Name</h4>
<h3>@viewDataEmployee.Name</h3>
Run Code Online (Sandbox Code Playgroud)

  • 帮助我解决,但我认为有一个错误.这个`<h4> @ ViewBag.emp.Name </ h4>`应该改为`<h4> @ ViewBag.Employee.Name </ h4>` (6认同)

Bar*_*xto 22

所有答案都表明ViewBag和/或是ViewData将数据传递ControllerViews错误的信息.两者都非常有用,可以将数据从视图传递到布局或部分传递到视图(或ViewComponents等).它不是控制器独占的.

作为默认的asp.net示例在布局页面中有这个:

<title>@ViewData["Title"] - MyApp</title>
Run Code Online (Sandbox Code Playgroud)

在任何观点

ViewData["Title"] = "Details";
Run Code Online (Sandbox Code Playgroud)

那么,问一下这个问题:" ViewBag和之间有什么区别ViewData?"

最显着的区别是ViewData强类型字典,而 ViewBag动态类型.

请注意,里面的数据是相同的

ViewData["Title"] = "MyTitle";
ViewBag.Title; // returns "MyTitle";
Run Code Online (Sandbox Code Playgroud)

什么时候使用?

  • ViewBag不支持无效的C#名称.你不能访问ViewData["Key With Space"]ViewBag
  • ViewBag.Something 是动态的,在调用需要在编译时知道确切参数的方法(如扩展方法)时可能会遇到问题.
  • ViewBag 可以检查nulls语法清理: ViewBag.Person?.Name
  • ViewData拥有字典的所有属性,如ContainsKey,Add等,所以你可以使用ViewData.Add("somekey", "somevalue")记住它可能会抛出异常.
  • ViewData在视图上使用需要TypeCasting而不需要ViewBag.

了解细微的差异,使用一个或另一个更多的是品味偏好.

通常你可以想到ViewBag.AnyKey别名ViewData["AnyKey"]

  • 这实际上是最完整的答案。 (3认同)

noo*_*otn 14

我可以建议您不要使用吗?

如果要将数据"发送"到屏幕,请发送强类型对象(AKA ViewModel),因为它更容易测试.

如果你绑定到某种"模型"并具有随机的"viewbag"或"viewdata"项目,那么它使自动化测试变得非常困难.

如果您正在使用这些,请考虑如何重组并使用ViewModel.

  • 忽略"编译器是第一个单元测试"主体,静态类型视图模型如何使您的代码比动态类型更易测试?虽然在动态类型的解决方案中对测试的要求更为重要,但如果两个解决方案实现相同数量和类型的测试,则不会丢失任何内容. (4认同)

Ala*_*ald 11

有一些微妙的差异意味着您可以使用与视图略有不同的ViewData和ViewBag.这篇文章中概述了一个优点http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx并显示了这一点可以通过使用ViewBag而不是ViewData来避免示例.


Ahm*_*att 6

viewdata:是用于在View和控制器之间存储数据的字典,你需要将视图数据对象转换为视图中的相应模型,以便能够从中检索数据...

ViewBag:是一个类似于视图数据的动态属性,但是它更好,因为在视图中使用它之前不需要将其转换为其corressponding模型...


小智 6

下面是关于 ViewData、ViewBag、TempData 和 Session 的点对点差异。 信用/复制 askforprogram.in,按照我在这里没有提到的代码示例的链接。

  1. MVC 中的视图数据

    • ViewData 是 ControllerBase 类的属性。
    • ViewData 是一种字典对象。
    • ViewData 是键值字典集合。
    • ViewData 是在 MVC 1.0 版本中引入的。
    • ViewData 适用于 .Net framework 3.5 及更高版本。
    • 枚举时需要对代码进行类型转换。
    • ViewData 对象仅保留当前请求的数据。
  2. MVC 中的 ViewBag

    • ViewBag 是 ControllerBase 类的属性。
    • ViewBag 是一种动态对象。
    • ViewBag 是一种对象。
    • ViewBag 是在 MVC 3.0 版本中引入的。
    • ViewBag 适用于 .Net 框架 4.0 及更高版本。
    • ViewBag 使用属性并处理它,因此无需在枚举时进行类型转换。
    • ViewBag 对象仅保留当前请求的数据。
  3. MVC 中的临时数据

    • TempData 是 ControllerBase 类的属性。
    • TempData 是一种字典对象。
    • TempData 是键值字典集合。
    • TempData 是在 MVC 1.0 版本中引入的。
    • TempData 适用于 .Net framework 3.5 及更高版本。
    • 枚举时需要对代码进行类型转换。
    • TempData 对象用于当前请求和后续请求之间的数据。
  4. MVC 中的会话

    • 会话是控制器(抽象类)的属性。
    • Session 是 HttpSessionStateBase 的一种。
    • Session 是键值字典集合。
    • 会话是在 MVC 1.0 版本中引入的。
    • TempData 适用于 .Net framework 1.0 及更高版本。
    • 枚举时需要对代码进行类型转换。
    • 会话对象保存所有请求的数据。对所有请求有效,永不过期。