我在MVC 3中看到ViewBag
。与MVC 2中的ViewData
有什么不同?
答案 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; ViewBag
和ViewData
之间的区别是什么?&#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
拥有词典的所有属性,例如ContainsKey
,Add
等,因此您可以使用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,请点击链接以获取我此处未提及的代码示例。
MVC中的ViewData
MVC中的ViewBag
MVC中的TempData
MVC中的会话
答案 9 :(得分:0)
查看包
dynamic
类的 ControllerBase
属性。ViewBag
仅适用于 .NET Framework 4.0 及更高版本。ViewBag
属性本质上是 dynamic
。ViewBag
返回动态类型对象,其属性也是 dynamic
。ViewData
快一点。查看数据
ViewData
是一个字典对象,它是 ControllerBase
类的属性。ViewData
比 ViewBag
快。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)
答案 12 :(得分:0)
查看数据
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 @item.productName</li>
}
</ul>
OutPut Screen。
答案 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: