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

#1 楼

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

因此,基本上可以替换魔术字符串:

ViewData["Foo"]

具有魔术特性:

ViewBag.Foo


对此您没有编译时间安全性。

我继续责怪Microsoft在MVC中引入此概念。

属性名称区分大小写。

评论


您指责Microsoft是出于什么目的?如果没有viewdata,我们如何绑定模型中的dropdownlist。 (我不认为在模型内部使用selectlist是个好主意)

– Subin Jacob
13年13月13日在10:46

@SubinJacob如果您想回答这个问题,那么您真的应该提出一个新问题。创建SelectList绝对是制作下拉列表的方法。

– MiniRagnarok
13年11月26日在15:10

我认为这有点主观。强类型模型很好用,但是对于需要快速启动视图并运行的情况,ViewBag等比Controller,View,Model,AutoMapper到ViewModel等的工作速度更快。

–克雷格·布雷特(Craig Brett)
2014年9月12日上午10:15

@Darin,您为什么“怪罪” Microsoft引入了此功能?它只是提供给开发人员的工具。如果您知道自己在做什么,则可以充分利用它。如果您不喜欢它,或者感觉它更容易出错,那就不要使用它。 :)

– Bilal Fazlani
15年3月15日在9:19

您如何建议在局部和布局之间传递数据?人们没有看到完整图片时会责备他们。我想您到处都有基本控制器和基本视图模型或静态/单个对象。猜猜是什么,更好地学习使用视图数据,并责怪自己使用了错误的工具来完成工作。

–巴特杯
16年2月12日在17:18

#2 楼

内部ViewBag属性作为名称/值对存储在ViewData词典中。

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

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


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


评论


这个问题问的是ViewData和ViewBag之间的区别,而不是关于ViewModel的区别。

–马修·弗拉申(Matthew Flaschen)
2011年11月7日在22:46

感谢单挑的Matthew Flaschen,我在响应中输入错误并修复了错误,现在读取“ ViewData”而不是ViewModel,这是一个错误。 :)

– Rich Bianco
2011年11月20日在20:02

现在不正确。两者均未重命名。它们都仍然存在。一种是动态的,并支持ViewBag.Message。一种使用旧的ViewData [“ Message”]语法。

–马修·弗拉申(Matthew Flaschen)
2011-11-20 21:32

+1但是,您引用的是什么来源...?应该确实提供一个链接。

–山姆
2012年5月18日14:31



谢谢山姆的建议。我已经添加了原始来源的链接。

– Rich Bianco
2012年10月8日在20:42

#3 楼

MVC中的ViewBag与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();
}   


调用在视图中

@ViewBag.Name    
@ViewData["Name"]


评论


您的答案表示类型转换,但您没有显示如何执行类型转换

– Alex
16年6月14日在20:04

#4 楼

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(); 
    }
}


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>


评论


帮助我理解,但我认为这是一个错误。此

@ ViewBag.emp.Name

应该更改为

@ ViewBag.Employee.Name



– Benny Margalit
17年1月27日在9:23

#5 楼

所有答案都表明ViewBag和/或ViewData会将数据从Controller传递到Views,这是错误信息。两者对于将数据从视图传递到布局或将部分数据传递到视图(或ViewComponents等)非常有用。这不是控制器专有的。

作为默认的asp.net示例在布局页面中具有以下内容:

<title>@ViewData["Title"] - MyApp</title>


,并且在任何视图中

ViewData["Title"] = "Details";


所以,然后问一个问题:“ ViewBag和有什么区别和ViewData?“

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

请注意,内部数据是相同的

ViewData["Title"] = "MyTitle";
ViewBag.Title; // returns "MyTitle";


何时使用一个或另一个?



ViewBag不支持无效的C#名称。
您无法使用ViewData["Key With Space"]访问ViewBag


ViewBag.Something是动态的,调用时可能会出现问题需要在编译时知道确切参数的方法(如扩展方法)。

ViewBag可以检查是否为空语法清洁程序:ViewBag.Person?.Name


ViewData具有所有字典的属性(例如ContainsKeyAdd等),因此您可以使用ViewData.Add("somekey", "somevalue")记住它可能会引发异常。
在视图上使用ViewData需要TypeCasting,而ViewBag则不需要TypeCasting。

知道细微的差异,使用一种或另一种则更喜欢口味。

通常,您可以将ViewBag.AnyKey视为ViewData["AnyKey"]的别名

评论


这实际上是最完整的答案。

– Heriberto Lugo
20年7月17日在23:14

#6 楼

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

如果您想将数据“发送”到屏幕上,请发送强类型对象(AKA ViewModel),因为它更易于测试。

如果您绑定到某种“模型”并具有随机的“ viewbag”或“ viewdata”项,则将使自动测试非常困难。

如果使用这些,请考虑如何能够重组并仅使用ViewModels。

评论


忽略“编译器是第一个单元测试”的原则,静态类型的视图模型如何使您的代码比动态类型的代码更具可测试性?尽管在动态类型的解决方案中对测试的要求更为重要,但是如果两个解决方案都实现相同数量和类型的测试,那么您将一无所获。

–达伦·刘易斯(Darren Lewis)
2011-12-22 11:29

我同意,这有点模糊。也许涉及智能感知。

–约书亚·拉米雷斯(Joshua Ramirez)
13年3月15日在7:00

一个例子就是嘲弄。如果要对控制器动作进行单元测试,则创建一个“模拟”对象以进行传递和声明要容易得多,而不是试图声明将某些字符串添加到某些字典中或将某些动态字段设置为某个值会更容易-与具有一个“请求”和一个“响应”对象而不是采用多个参数的服务合同类似的概念。

– nootn
13年3月25日在12:08



如果不使用两者,如何将数据从视图传递到布局? -1

–巴特杯
16年7月14日在19:20

这个答案如何?

– JSON
17年7月24日在19:59

#7 楼

有一些细微的差异,这意味着您可以以与视图稍有不同的方式来使用ViewData和ViewBag。这篇文章(http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx)概述了一个优势,并显示了在示例中可以通过使用ViewBag代替ViewData来避免。

#8 楼

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

ViewBag:是一个动态属性,其工作方式类似于视图数据,但是更好的情况是,不必在视图中使用它之前将其强制转换为对应的模型...

#9 楼

以下是关于ViewData,ViewBag,TempData和Session的点对点差异。
信贷/复制askforprogram.in,请单击此处未提及的代码示例链接。



MVC中的ViewData


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



MVC中的ViewBag


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



Memp中的TempData


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



MVC中的会话


会话是Controller(Abstract Class)的属性。
会话是HttpSessionStateBase的类型。
会话是键值字典集合。
会话是MVC中引入的1.0版。
TempData可与.Net Framework 1.0及更高版本一起使用。
枚举时需要进行代码的类型转换。
Session对象保留所有请求的数据。对于所有请求均有效,永不过期。




#10 楼

尽管选择一种格式而不使用另一种格式可能没有技术上的优势,但您应该了解两种语法之间的一些重要区别。一个明显的区别是ViewBag仅在您正在访问的密钥
是有效的C#标识符。例如,如果您在ViewData [“ Key
带空格”]中放置一个值,则由于无法编译代码
,因此无法使用ViewBag访问该值。
另一个关键问题要考虑的是,您不能将动态值作为参数传递给扩展方法。为了选择正确的扩展方法,C#编译器必须在编译时知道每个
参数的真实类型。如果任何参数是动态的,则编译将失败。例如,此代码将总是失败:@ Html.TextBox(“ name”,ViewBag.Name)。要解决此问题,
使用ViewData [“ Name”]或强制转换va

#11 楼

public ActionResult Index()
{
    ViewBag.Name = "Monjurul Habib";
    return View();
}

public ActionResult Index()
{
    ViewData["Name"] = "Monjurul Habib";
    return View();
} 

In View:

@ViewBag.Name 
@ViewData["Name"] 


#12 楼

这样,我们可以使它使用这些值在控制器之间使用TEMP DATA
将信息传递到其他页面。

#13 楼

我注意到ViewData和ViewBag之间的一个主要区别是:

ViewData:它会返回对象,不管您分配给它什么,都需要再次类型转换回原始类型。

ViewBag:返回指定的确切类型已经足够聪明了,无论您分配的是简单类型(即int,字符串等)还是复杂类型都无所谓。

Ex :控制器代码。

 namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            Products p1 = new Products();
            p1.productId = 101;
            p1.productName = "Phone";
            Products p2 = new Products();
            p2.productId = 102;
            p2.productName = "laptop";

            List<Products> products = new List<Products>();
            products.Add(p1);
            products.Add(p2);
            ViewBag.Countries = products;
            return View();
        }
    }
    public class Products
    {
        public int productId { get; set; }
        public string productName { get; set; }
    }
}


查看代码。

<ul>
            @foreach (WebApplication1.Controllers.Products item in ViewBag.Countries)
            {
            <li>@item.productId &nbsp;&nbsp;&nbsp;@item.productName</li>
            }
        </ul>


输出屏幕。

/>

#14 楼

ViewData


ViewData用于将数据从控制器传递到视图
它是从ViewDataDictionary类派生的
仅可用于当前请求
复杂数据类型的类型转换,并检查null值以避免错误
如果发生重定向,则其值将变为null


ViewBag


> ViewBag还用于将数据从控制器传递到各自的视图
ViewBag是一种动态属性,它利用了C#4.0中的新动态功能
它也仅可用于当前请求
/>如果发生重定向,则其值将为空
对于复杂数据类型不需要类型转换


#15 楼

这里,ViewData和ViewBag都用于将数据从Controller传递到View。

1。 ViewData

-ViewData是派生自ViewDataDictonary类的字典对象。

-数据仅允许一个请求,发生页面重定向时会清除ViewData值。

-ViewData值必须在使用前键入cate.。

示例:在Controller中

public ActionResult PassingDatatoViewWithViewData()
{
      ViewData["Message"] = "This message shown in view with the ViewData";
      return View();
}


在View中
/>
@ViewData["Message"];


-如果ViewData是像键和值这样的对,则消息是键,而在反逗号中则是值。

-数据是很简单,因此如果数据复杂,我们就不能在这里使用类型转换。

public ActionResult PassingDatatoViewWithViewData()
{
      var type= new List<string>
    {
        "MVC",
        "MVP",
        "MVVC"
    };
    ViewData["types"] = type;
    return View();
}


-在视图中,数据可以提取为

<ul>
        @foreach (var items in (List<string>)ViewData["types"])
        {
         <li>@items</li>
        }
  </ul>


2。 ViewBag

--ViewBag使用动态功能.ViewBag包装在ViewData周围。

-在ViewBag中需要强制类型转换。

-与ViewData相同,如果发生重定向,则值变为null。

示例:

public ActionResult PassingDatatoViewWithViewBag()
{
          ViewData.Message = "This message shown in view with the ViewBag";
          return View();
}


在View

@ViewBag.vbMessage


-对于复杂类型,请使用ViewBag

public ActionResult PassingDatatoViewWithViewBag()
{
          var type= new List<string>
        {
            "MVC",
            "MVP",
            "MVVC"
        };
        ViewBag.types = type;
        return View();
 }


-在View中可以将数据提取为

<ul>
       @foreach (var items in ViewBag.types)
       {
         <li>@items</li>
       }
</ul>


-主要区别在于ViewBag不需要强制转换,而ViewData是必需强制转换。

#16 楼

ViewBag和ViewData是用于将信息从控制器传递到ASP.Net MVC中的视图的两种方法。使用这两种机制的目的是提供控制器与View之间的通信。两者都有很短的寿命,一旦发生重定向,即一旦页面从源页面(我们在其中设置了ViewBag或ViewData的值)重定向到目标页面,ViewBag和ViewData的值都将变为null。变为null。

尽管两者都有相似之处(ViewBag和ViewData),但如果我们谈论两者的实现,则是两个不同的事物。区别如下:

1.)如果我们分析两种实现方式的明智之处,那么我们将发现ViewData是一个字典数据结构-源自ViewDataDictionary的对象字典,可以使用字符串作为这些值的键进行访问而ViewBag利用了C#4.0中引入的动态功能,并且是一个动态属性。

2.)在从ViewData访问值时,我们需要在存储值(数据类型)时进行类型转换。作为ViewData字典中的Objects,但是如果我们在使用ViewBag的情况下访问该值,则不需要这样。

3。)在ViewBag中,我们可以这样设置值:

      ViewBag.Name = "Value"; 


并可以按以下方式访问:

          @ViewBag.Name


对于ViewData,可以按以下方式设置和访问值:
如下设置ViewData:

ViewData["Name"] = "Value";


并像这样访问值

 @ViewData["Name"] 


了解更多详细信息点击这里:

评论


抱歉,我对此表示不满,但是这个答案花了几段时间说没什么用。我从rachelappel.com/了解到,“被接受的答案”中缺少的有用内容是“ viewbag是围绕viewdata的动态包装器”。

–克里斯·卡罗尔(Chris F Carroll)
2015年3月30日15:56