ViewData 和 ViewBag 有什么区别?
-
11-10-2019 - |
题
我看到了 ViewBag
在MVC 3中。这和有什么不同 ViewData
在 MVC 2 中?
解决方案
它使用C#4.0动态功能。它实现了与ViewData相同的目标,应避免使用强烈键入的视图模型(与应避免使用ViewData相同的方式)。
因此,基本上它取代了 魔术弦:
ViewData["Foo"]
和 魔术特性:
ViewBag.Foo
您没有编译时间安全。
我继续将Microsoft归咎于MVC中的Microsoft。
属性的名称是案例敏感的。
其他提示
内部 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属性使用一些简单的语法来实现相同的目的。例如,您可以编写ViewBag.Message =“ Text”,而不是编写ViewData [“ Message”] =“ Text”。您无需定义任何强大的类即可使用ViewBag属性。因为它是一个动态属性,因此您可以仅获取或设置属性,并且可以在运行时动态解析它们。在内部,ViewBag属性存储在ViewData词典中的名称/值对。 (注意:在MVC 3的大多数预释放版本中,ViewBag属性被命名为ViewModel属性。)
MVC中的ViewBag vs 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"]
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
和/或 ViewData
是传递数据 Controller
至 Views
这是错误的信息。两者对于将数据从视图传递到布局或部分到视图(或视图组件等)非常有用,这不是控制器的独家。
由于默认的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
具有字典的所有属性ContainsKey
,Add
, 等等。所以你可以使用ViewData.Add("somekey", "somevalue")
请记住,它可能会引发例外。- 使用
ViewData
在视图上需要打字时ViewBag
不。
了解微妙的差异,使用一个或另一个或多个味道偏好。
通常你可以想到 ViewBag.AnyKey
别名 ViewData["AnyKey"]
我可以向您推荐不要使用吗?
如果要将数据发送到屏幕,请发送强烈键入的对象(又称ViewModel),因为它易于测试。
如果您绑定到某种“模型”,并具有随机的“ ViewBag”或“ ViewData”项目,则它使自动测试非常困难。
如果您使用这些,请考虑如何重组和使用ViewModels。
有一些细微的差异,这意味着您可以从视图中以略有不同的方式使用ViewData和ViewBag。这篇文章中概述了一个优势 http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-innamic-in-asp-net-mvc-3-rc-2.aspx 并证明可以在示例中使用ViewBag而不是ViewData避免铸造。
ViewData: 是用于在视图和控制器之间存储数据的字典,您需要在视图中将视图数据对象投放到其相应的模型中,以便能够从中检索数据...
ViewBag: 与视图数据相似的动态属性是一个类似的动态属性,但是更好的是,它不需要将其施放到其Corressponding模型之前,然后在视图中使用它。
以下是有关ViewData,ViewBag,Tempdata和Session的点差异。信用/复制的askforprogram.in ,请按照我在此处尚未提到的代码示例的链接。
MVC中的ViewData
- ViewData是ControllerBase类的属性。
- ViewData是一种字典对象。
- ViewData是键值字典集合。
- ViewData是在MVC 1.0版本中引入的。
- ViewData可与.NET Framework 3.5及以上合作。
- 需要在枚举时进行代码的类型转换。
- ViewData对象仅保留当前请求的数据。
MVC中的ViewBag
- ViewBag是ControllerBase类的属性。
- ViewBag是一种动态对象。
- ViewBag是一种对象。
- ViewBag是在MVC 3.0版本中引入的。
- ViewBag可与.NET Framework 4.0及更高版本一起使用。
- ViewBag使用属性并处理它,因此无需在枚举时进行键入转换。
- ViewBag对象仅保留数据以当前请求。
MVC中的tempdata
- tempdata是ControllerBase类的属性。
- tempdata是一种字典对象。
- tempdata是键值字典集合。
- tempdata是在MVC 1.0版本中引入的。
- Tempdata与.NET Framework 3.5及以上配合使用。
- 需要在枚举时进行代码的类型转换。
- tempdata对象用于当前请求和后续请求之间的数据。
MVC中的会话
- 会话是控制器(摘要类)的属性。
- 会话是一种httpsessionstatebase。
- 会话是键值字典集合。
- 会话是在MVC 1.0版本中引入的。
- tempdata与.NET Framework 1.0及更高版本一起使用。
- 需要在枚举时进行代码的类型转换。
- 会话对象保留所有请求的数据。对所有请求有效,永不过期。
尽管您可能没有选择一种格式而不是另一种格式的技术优势,但是您应该意识到两种语法之间的一些重要差异。一个明显的区别是,仅当要访问的键是有效的C#标识时,ViewBag才能起作用。例如,如果将值放置在ViewData [“带空格的键”]中,则无法使用ViewBag访问该值,因为代码不会编译。要考虑的另一个关键问题是,您不能将动态值作为参数传递给扩展方法。 C#编译器必须在编译时知道每个参数的实际类型,才能选择正确的扩展方法。如果任何参数是动态的,则汇编将失败。例如,此代码将始终失败: @html.textbox(“ name”,viewbag.name)。为了解决这个问题,要么使用ViewData [“名称”]或铸造VA
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之间的一个主要区别是:
VIEWDATA:它将返回对象无关紧要您分配给此内容,并且需要再次将其打入原始类型。
ViewBag:返回精确类型已分配给它的内容是足够明智的,您分配了简单类型(即INT,字符串等)或复杂类型的天气无关紧要。
例如:控制器代码。
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>
输出屏幕。
查看数据
- ViewData 用于将数据从控制器传递到视图
- ViewData 派生自 ViewDataDictionary 类,基本上是一个 Dictionary 对象,即键和值,其中键是字符串,而值是对象。
- 从 ViewData 检索数据时需要进行数据类型转换,因为它的数据类型为对象,并且在类型转换之前还需要检查 null vvalue,否则会破坏应用程序。如果发生重定向,则其值将变为null读取tempdata ViewData和View Bag之间的完全差异
http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html
- ViewData用于传递来自控制器的数据查看
- 它是从ViewDatationary类得出的
- 它仅适用于当前请求
- 需要为复杂的数据类型打字并检查空值以避免错误
- 如果发生重定向,则其值变为null
- ViewBag还用于将数据从控制器传递到相应的视图
- ViewBag是一种动态属性,它利用C#4.0中的新动态功能
- 它也仅适用于当前请求
- 如果发生重定向,则其值变为null
- 不需要为复杂数据类型打字
这里 ViewData 和 ViewBag 两者都使用来自 控制器 至 看法.
1. ViewData
- viewData是源自源自的字典对象 ViewDatadictonary 班级。
- 数据仅允许一个请求,当页面重定向时,ViewData值会被清除。
- 使用前必须在使用前键入ViewData值。
例子: 在控制器中
public ActionResult PassingDatatoViewWithViewData()
{
ViewData["Message"] = "This message shown in view with the ViewData";
return 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使用Dynamic Feature.ViewBag包装器周围的ViewData。
- 在ViewBag类型中,需要铸造。
- 与viewData相同,如果重定向发生,则值将变为null。
例子:
public ActionResult PassingDatatoViewWithViewBag()
{
ViewData.Message = "This message shown in view with the ViewBag";
return View();
}
根据观点
@ViewBag.vbMessage
- for复杂类型使用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和ViewData是两种方法,用于将信息从控制器传递到ASP.NET MVC中的视图。使用这两种机制的目的是在控制器和视图之间提供通信。两者都有短的寿命,一旦重定向发生IE,两者的价值就变为null,一旦该页面从源页面重定向(我们将ViewBag或ViewData的值设置为目标页面)重定向到目标页面,则ViewData和ViewData变为无效。
尽管有这些相似之处(ViewBag和ViewData),如果我们谈论两者的实施,则是两件事。差异如下:
1.)如果我们明智地分析了两个实现,那么我们会发现ViewData是词典数据结构 - 从ViewDataDictionary派生的对象的字典,并且使用字符串作为这些值的键访问,而ViewBag则使用C#4.0和C#4.0和是动态属性。
2.)在访问值fire viewData时,我们需要将值(数据类型)分类为“ datatypes”,因为它们被存储在ViewData字典中,但是如果我们在ViewBag时访问TH值,则没有这种需求。
3.)在ViewBag中,我们可以设置这样的值:
ViewBag.Name = "Value";
并且可以如下访问:
@ViewBag.Name
虽然在ViewData的情况下,可以设置和访问值如下:设置ViewData如下:
ViewData["Name"] = "Value";
并访问这样的价值
@ViewData["Name"]
更多细节 点击这里: