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>
16 回答
View Data
ViewData用于将数据从控制器传递到视图
ViewData派生自ViewDataDictionary类,基本上是一个Dictionary对象,即Keys和Values,其中Keys是String,而Values是对象 .
从ViewData中检索数据时需要数据预测,因为它的数据类型为对象,并且还需要null vvalue检查类型转换,否则会破坏应用程序 . 如果发生重定向,则其值变为null读取TempData ViewData和View Bag之间的完全差异
http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html
它使用C#4.0动态功能 . 它实现了与viewdata相同的目标,应该避免使用强类型视图模型(应该避免使用与viewdata相同的方式) .
所以基本上它取代了魔术字符串:
具有魔力属性:
你没有编译时的安全性 .
我继续责怪微软在MVC中引入这个概念 .
属性的名称区分大小写 .
内部 ViewBag 属性在 ViewData dictionary 中存储为名称/值对 .
注意:在MVC 3的大多数预发布版本中,ViewBag属性被命名为ViewModel,如MVC 3发行说明中的片段中所述:
(edited 10-8-12) 有人建议我发布我发布的这个信息的来源,这里是来源:http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4
ViewBag vs ViewData in MVC
http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html
Similarities between ViewBag & ViewData :
Difference between ViewBag & ViewData:
ViewBag & ViewData Example:
在视野中呼唤
ViewData
:复杂数据类型需要类型转换,并检查空值以避免错误 .ViewBag
:复杂数据类型不需要类型转换 .请考虑以下示例:
View
的代码如下:所有答案都表明
ViewBag
和/或ViewData
将数据从Controller
传递给Views
,这是错误的信息 . 两者都非常有用,可以将数据从视图传递到布局或部分传递到视图(或ViewComponents等) . 它不是控制器独占的 .作为默认的asp.net示例在布局页面中有这个:
在任何观点
那么,问一下这个问题:“
ViewBag
和ViewData
之间有什么区别?”最显着的区别是
ViewData
是强类型字典,而ViewBag
是动态类型 .请注意 IS THE SAME 中的数据
什么时候使用?
ViewBag
不能't support not valid C# names. you can' t使用ViewBag
访问ViewData["Key With Space"]
ViewBag.Something
是动态的,在调用需要在编译时知道确切参数的方法(如扩展方法)时可能会遇到问题 .ViewBag
可以检查空语句清除器:ViewBag.Person?.Name
ViewData
具有字典的所有属性,如ContainsKey
,Add
等,因此您可以使用ViewData.Add("somekey", "somevalue")
请记住它可能会抛出异常 .在视图上使用
ViewData
需要TypeCasting而ViewBag
不需要 .了解细微的差异,使用一个或另一个更多的是品味偏好 .
通常您可以将
ViewBag.AnyKey
视为ViewData["AnyKey"]
的别名我可以建议您不要使用吗?
如果要将数据“发送”到屏幕,请发送强类型对象(A.K.A.ViewModel),因为它更容易测试 .
如果你绑定到某种“模型”并具有随机的“viewbag”或“viewdata”项目,那么它使自动化测试变得非常困难 .
如果您正在使用这些,请考虑如何重组和只需使用ViewModels .
有一些微妙的差异意味着您可以使用与视图略有不同的ViewData和ViewBag . 在这篇文章http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx中概述了一个优点,并且通过使用ViewBag而不是ViewData可以避免在示例中进行强制转换 .
viewdata: 是用于在View和控制器之间存储数据的字典,你需要将视图数据对象转换为视图中的相应模型,以便能够从中检索数据...
ViewBag: 是一个动态属性,类似于它对视图数据的工作,但是它更好,因为在视图中使用它之前不需要将其转换为其corressponding模型...
通过这种方式,我们可以使用值来将控制器之间的信息传递给具有TEMP DATA的其他页面
虽然选择一种格式而不是另一种格式可能没有技术优势,但您应该注意两种语法之间的一些重要差异 . 一个明显的区别是ViewBag仅在您访问的密钥是有效的C#标识符时才起作用 . 例如,如果在ViewData [“Key With Spaces”]中放置一个值,则无法使用ViewBag访问该值,因为代码将无法编译 . 另一个需要考虑的关键问题是您不能将动态值作为参数传递给扩展方法 . C#编译器必须在编译时知道每个参数的实际类型,以便选择正确的扩展方法 . 如果任何参数是动态的,则编译将失败 . 例如,此代码将始终失败:@ Html.TextBox(“name”,ViewBag.Name) . 要解决此问题,请使用ViewData [“Name”]或转换va
我注意到ViewData和ViewBag之间的一个主要区别是:
ViewData:它将返回对象并不重要你已经分配到这个并且需要再次类型转换回原始类型 .
ViewBag:它足够聪明地返回您分配给它的确切类型,无论您分配简单类型(即int,string等)或复杂类型的天气 .
Ex: Controller code.
View Code.
OutPut Screen.
ViewData的
ViewData用于将数据从控制器传递到视图
它派生自ViewDataDictionary类
仅适用于当前请求
需要对复杂数据类型进行类型转换,并检查空值以避免错误
如果发生重定向,则其值变为null
ViewBag
ViewBag还用于将数据从控制器传递到相应的视图
ViewBag是一个动态属性,它利用了C#4.0中的新动态功能
它也仅适用于当前请求
如果发生重定向,则其值变为null
不需要对复杂数据类型进行类型转换
这里 ViewData 和 ViewBag 都用于将数据从 Controller 传递到 View .
1. ViewData
ViewData是从 ViewDataDictonary 类派生的字典对象 .
数据仅允许一个请求,当页面重定向发生时,ViewData值被清除 .
ViewData值必须在使用前输入cate .
Example: 在控制器中
在视图中
ViewData是一对像 Key 和 Value ,Message是Key,倒置逗号值是Value .
数据很简单,所以如果数据很复杂,那么我们就不能在这里使用类型转换 .
2. ViewBag
--ViewBag使用ViewData周围的动态feature.ViewBag包装器 .
在ViewBag中需要类型转换 .
与ViewData相同,如果重定向发生,则值变为null .
Example:
在视图中
ViewBag和ViewData是用于在ASP.Net MVC中将信息从控制器传递到视图的两种方法 . 使用这两种机制的目的是提供控制器和视图之间的通信 . 两者都有短暂的生命,一旦重定向发生,两者的值都变为null,即,一旦页面从源页面(我们设置ViewBag或ViewData的值)重定向到目标页面,ViewBag和ViewData都是变为空 .
尽管有这些相似之处(ViewBag和ViewData),如果我们谈论两者的实现,它们是两回事 . 差异如下:
1.)如果我们分析两种实现方式,那么我们会发现ViewData是一个字典数据结构 - 从ViewDataDictionary派生的对象字典,可以使用字符串作为这些值的键来访问,而ViewBag则使用C#4.0中引入的动态特性和是一个动态的属性 .
2.)在从ViewData访问值时,我们需要对值(数据类型)进行类型转换,因为它们在ViewData字典中存储为对象,但是如果我们在ViewBag的情况下访问该值则没有这种需要 .
3.)在ViewBag中,我们可以像这样设置值:
并可以访问如下:
在ViewData的情况下,可以按如下方式设置和访问值:设置ViewData,如下所示:
和访问这样的 Value
详情click here: