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


当前回答

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

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

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

在任何情况下

ViewData["Title"] = "Details";

然后,问这个问题:“ViewBag和ViewData之间有什么区别?”

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

注意里面的数据IS the SAME

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

什么时候用这个或那个?

ViewBag doesn't support not valid C# names. you can't access ViewData["Key With Space"] with ViewBag ViewBag.Something is dynamic and you may have problems when calling methods (like extension methods) that needs to know the exact parameter at compile time. ViewBag can check for nulls syntactical cleaner: ViewBag.Person?.Name ViewData have all the properties of a Dictionary like ContainsKey, Add, etc. so you can use ViewData.Add("somekey", "somevalue") keep in mind it might throw exceptions. Using ViewData on views needs TypeCasting while ViewBag don't.

知道了细微的差别,使用其中一种更像是一种口味偏好。

通常你可以想到ViewBag。ViewData别名的任意键["AnyKey"]

其他回答

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

ViewBag:是一个动态属性,在它的工作类似于视图数据,但它是更好的,因为它不需要在视图中使用它之前被强制转换为相应的模型…

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

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

In View:

@ViewBag.Name 
@ViewData["Name"] 

这里ViewData和ViewBag都用于将数据从控制器传递到视图。

1. 显示数据

——ViewData是字典对象,从ViewDataDictonary类派生。

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

——ViewData值必须在使用前输入。

示例:在控制器中

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

在视图

@ViewData["Message"];

——ViewData是Key和Value这样的一对,Message是Key,在倒逗号中Value是Value。

数据是简单的,所以我们不能在这里使用类型转换,如果数据是复杂的,那么使用类型转换。

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

在视图

@ViewBag.vbMessage

—对于复杂类型使用ViewBag

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

在视图中数据可以提取为

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

主要的区别是ViewBag不需要类型转换,而ViewData需要类型转换。

ViewBag vs MVC中的ViewData

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

ViewBag和ViewData的相似之处:

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

ViewBag和ViewData的区别:

ViewData是派生自的对象字典 viewdatdictionary类,并使用字符串作为键访问。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"]

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>