ViewData和ViewBag有什么区别?

时间:2011-01-16 12:49:49

标签: .net asp.net-mvc-3 difference viewbag viewdata

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

18 个答案:

答案 0 :(得分:371)

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

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

ViewData["Foo"]

使用魔法属性

ViewBag.Foo

您没有编译时安全性。

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

属性的名称区分大小写。

答案 1 :(得分:41)

内部 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属性来完成   同样的目的。例如,而不是   写ViewData [“Message”] =“text”,   你可以写ViewBag.Message =“text”。   您不需要定义任何   强类型类使用   ViewBag属性。因为它是一个   动态属性,你可以改为   获取或设置属性,它会   在运行时动态解决它们。   在内部,ViewBag属性是   存储为名称/值对   ViewData字典。 (注意:大多数情况下   预发布版本的MVC 3,   ViewBag属性被命名为   ViewModel属性。)

答案 2 :(得分:33)

ViewBag与MVC中的ViewData

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

ViewBag&的相似之处ViewData:

  

帮助您在从控制器移动到视图时保持数据。习惯了   将数据从控制器传递到相应的视图。寿命短意味着   重定向发生时,value变为null。这是因为他们的目标   是提供一种在控制器和视图之间进行通信的方法。它的   服务器调用中的通信机制。

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"]

答案 3 :(得分:28)

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>

答案 4 :(得分:19)

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

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

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

并且在任何视图中

ViewData["Title"] = "Details";

那么,提出问题:&#34; ViewBagViewData之间的区别是什么?&#34;

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

请注意中的数据是相同的

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

何时使用其中一种?

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

了解细微的差异,使用一种或另一种更有口味偏好。

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

答案 5 :(得分:14)

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

如果要将数据“发送”到屏幕上,请发送强类型对象(A.K.A.ViewModel),因为它更容易测试。

如果你绑定某种“模型”并拥有随机的“viewbag”或“viewdata”项目,那么它会使自动化测试变得非常困难。

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

答案 6 :(得分:11)

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

答案 7 :(得分:6)

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

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

答案 8 :(得分:1)

以下是关于ViewData,ViewBag,TempData和Session的点对点差异。 Credit/copied askforprogram.in,请点击链接以获取我此处未提及的代码示例。

  1. MVC中的ViewData

    • 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 Framework 4.0及更高版本一起使用。
    • ViewBag使用属性并对其进行处理,因此在 枚举。
    • ViewBag对象仅保留当前请求的数据。
  3. MVC中的TempData

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

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

答案 9 :(得分:0)

查看包

  1. 它返回类型对象。
  2. 它是 dynamic 类的 ControllerBase 属性。
  3. ViewBag 仅适用于 .NET Framework 4.0 及更高版本。
  4. 它在使用前不需要 TypeCasting,因为 ViewBag 属性本质上是 dynamic
  5. ViewBag 返回动态类型对象,其属性也是 dynamic
  6. 它比 ViewData 快一点。

查看数据

  1. 它返回键值字典对集合。
  2. ViewData 是一个字典对象,它是 ControllerBase 类的属性。
  3. ViewDataViewBag 快。
  4. 枚举时需要类型转换代码,因为它是一个字典对集合。
  5. ViewData 返回对象(键值对的类型,值是对象类型,使用前需要强制转换)

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

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

在视图中调用

@ViewBag.Name    
@ViewData["Name"]

答案 10 :(得分:0)

此处 ViewData ViewBag 都用于将数据从 Controller 传递到 View

1。 ViewData

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

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

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

示例:在控制器中

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

在视图中

@ViewData["Message"];

-如果ViewData是 Key Value 之类的对,则Message为Key,反逗号为Value。

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

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

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

在视图中

@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 是必需的类型转换。

答案 11 :(得分:0)

ViewData的
  1. ViewData用于将数据从控制器传递到视图
  2. 它派生自ViewDataDictionary类
  3. 仅适用于当前请求
  4. 需要对复杂数据类型进行类型转换并检查空值以避免错误
  5. 如果发生重定向,则其值变为空
ViewBag
  1. ViewBag还用于将数据从控制器传递到相应的视图
  2. ViewBag是一个动态属性,它利用了C#4.0中的新动态功能
  3. 它也仅适用于当前请求
  4. 如果发生重定向,则其值变为空
  5. 不需要对复杂数据类型进行类型转换

答案 12 :(得分:0)

查看数据

  1. ViewData用于将数据从控制器传递到视图
  2. ViewData派生自ViewDataDictionary类,基本上是一个Dictionary对象,即Key为Keys,其中Keys为String,而Values为对象。
  3. 从ViewData检索数据时需要进行数据预测,因为它的数据类型为对象,并且还会对类型转换进行null vvalue检查,否则会破坏应用程序。 如果发生重定向,则其值变为null 阅读TempData ViewData和View Bag之间的全部区别
  4. http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html

答案 13 :(得分:0)

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

ViewData:它将返回对象并不重要你已经分配到这个并且需要再次类型转换回原始类型。

ViewBag:它足够聪明地返回您分配给它的确切类型,无论你分配简单类型(即int,string等)或复杂类型的天气都无关紧要。

例如:控制器代码。

 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>

OutPut Screen。

enter image description here

答案 14 :(得分:0)

虽然选择一种格式可能没有技术优势 另一方面,你应该意识到两者之间的一些重要差异 语法。 一个明显的区别是ViewBag仅在您访问的密钥时起作用 是一个有效的C#标识符。例如,如果在ViewData [“Key”中放置一个值 使用Spaces“],您无法使用ViewBag访问该值,因为代码 不会编译。 另一个需要考虑的关键问题是您不能将动态值作为参数传递 扩展方法。 C#编译器必须知道每个的真实类型 编译时的参数,以便选择正确的扩展方法。 如果任何参数是动态的,则编译将失败。例如,这段代码会 总是失败:@ Html.TextBox(“name”,ViewBag.Name)。要解决这个问题 使用ViewData [“Name”]或转换va

答案 15 :(得分:0)

通过这种方式,我们可以使用值将控制器之间的信息传递给TEMP DATA的其他页面

答案 16 :(得分:0)

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

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

In View:

@ViewBag.Name 
@ViewData["Name"] 

答案 17 :(得分:-1)

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

如果我们谈论两者的实现,尽管有这些相似之处(ViewBag和ViewData)是两回事。差异如下:

1。)如果我们分析两种实现方式,那么我们会发现ViewData是一个字典数据结构 - 从ViewDataDictionary派生的Objects字典,可以使用字符串作为这些值的键来访问,而ViewBag则使用C中引入的动态特性#4.0并且是动态属性。

2.。)从ViewData访问值时,我们需要对值(数据类型)进行类型转换,因为它们在ViewData字典中存储为对象,但如果我们在ViewBag的情况下访问th值,则不需要这样做。 / p>

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

      ViewBag.Name = "Value"; 

并可以按如下方式访问:

          @ViewBag.Name

在ViewData的情况下,可以按如下方式设置和访问值:     按如下方式设置ViewData:

ViewData["Name"] = "Value";

并像这样访问价值

 @ViewData["Name"] 

有关详细信息click here: