您的位置:首页 > 编程语言 > ASP

[转]Asp.net MVC中的ViewData与ViewBag

2017-03-02 15:36 459 查看
本文转自:http://www.cnblogs.com/wintersun/archive/2012/01/21/2328563.html

在Asp.net MVC 3 web应用程序中,我们会用到ViewDataViewBag,对比一下:

ViewDataViewBag
它是Key/Value字典集合它是dynamic类型对像
从Asp.net MVC 1 就有了ASP.NET MVC3 才有
基于Asp.net 3.5 framework基于Asp.net 4.0与.net framework
ViewData比ViewBag快ViewBag比ViewData慢
在ViewPage中查询数据时需要转换合适的类型在ViewPage中查询数据时不需要类型转换
有一些类型转换代码可读性更好
在Controller中使用ViewData:

public ActionResult UsingViewData()
{

ViewData["Title"] = " Using ViewData";
ViewData["ProjectName"] = "My Test Project";
ViewData["ProjectDescription"] = "This is Test Project to demo Viewdata and viewbag details";
ViewData["StartDate"] = new DateTime(2011, 1, 1);
ViewData["TotalPrice"] = 1000;
ViewData["TotalDays"] = 100;
Dictionary<string, string> stackholder = new Dictionary<string, string>();
stackholder.Add("Client","Mr.  Client");
stackholder.Add("Manager","Mr. Joy");
stackholder.Add("Team Leader","Mr.Toy");
stackholder.Add("Sr. developer", "Mr.dojoy");
stackholder.Add("developer", "Mr. nodoy");
ViewData["stackholder"] = stackholder;

List<string> modules = new List<string>();
modules.Add("Admin module");
modules.Add("ShoppingCart module");
modules.Add("CMS module");
ViewData["modules"] = modules;
return View();
}

对应UsingViewData View的cshtml:

<h1>@ViewData["Title"]</h1>
<div>
<div>
<h2>Project Name : @ViewData["ProjectName"]</h2>
</div>
<div>
ProjectDescription :
<p>"@ViewData["ProjectDescription"]".</p>
</div>
<div>
Stack Holder :
<br />

<ul id="stakholder">
@foreach ( var stakerholder in ViewData["stackholder"] as Dictionary<string, string> )
{
<li>
@stakerholder.Key   : @stakerholder.Value
</li>
}
</ul>
</div>
<div>
Project Details:<br />
<div>
module List  :
<ul id="modulelist">
@foreach ( var module in ViewData["modules"] as List<string> )
{
<li>
@module
</li>
}
</ul>

</div>
Project StartDate : @ViewData["StartDate"]  <br />
Project TotalPrice: @ViewData["TotalPrice"] <br />
Project TotaDays  : @ViewData["TotalDays"]
</div>
</div>

然后是ViewBag:

public ActionResult UsingViewBag()
{

ViewBag.Title = " Using ViewBag";
ViewBag.ProjectName = "My Test Project";
ViewBag.ProjectDescription = "This is Test Project to demo Viewdata and viewbag details";
ViewBag.StartDate = new DateTime(2011, 1, 1);
ViewBag.TotalPrice = 1000;
ViewBag.TotalDays = 100;
Dictionary<string, string> stackholder = new Dictionary<string, string>();
stackholder.Add("Client", "Mr.  Client");
stackholder.Add("Manager", "Mr. Joy");
stackholder.Add("Team Leader", "Mr.Toy");
stackholder.Add("Sr. developer", "Mr.dojoy");
stackholder.Add("developer", "Mr. nodoy");
ViewBag.stackholder = stackholder;

List<string> modules = new List<string>();
modules.Add("Admin module");
modules.Add("ShoppingCart module");
modules.Add("CMS module");
ViewBag.modules = modules;
return View();
}

对应View UsingViewBag 的cshtml的ViewBag:

<h1>@ViewBag.Title</h1>
<div>
<div>
<h2>Project Name : @ViewBag.ProjectName</h2>
</div>
<div>
ProjectDescription :
<p>"@ViewBag.ProjectDescription.</p>
</div>
<div>
Stack Holder :
<br />

<ul id="stakholder">
@foreach ( var stakerholder in ViewBag.stackholder )
{
<li>
@stakerholder.Key   : @stakerholder.Value
</li>
}
</ul>
</div>
<div>
Project Details:<br />
<div>
module List  :
<ul id="modulelist">
@foreach ( var module in ViewBag.modules )
{
<li>
@module
</li>
}
</ul>

</div>
Project StartDate : @ViewBag.StartDate.ToString("dd-MMM-yyyy") <br />
Project TotalPrice: @ViewBag.TotalPrice  ₹  <br />
Project TotaDays  : @ViewBag.TotalDays
</div>
</div>

后面是在Controller中使用ViewBag:

public ActionResult UsingViewBagInControlAndViewDataInView()
{

ViewBag.Title = " Using ViewBag In Control And ViewData In View";
ViewBag.ProjectName = "My Test Project";
ViewBag.ProjectDescription = "This is Test Project to demo Viewdata and viewbag details";
ViewBag.StartDate = new DateTime(2011, 1, 1);
ViewBag.TotalPrice = 1000;
ViewBag.TotalDays = 100;
Dictionary<string, string> stackholder = new Dictionary<string, string>();
stackholder.Add("Client", "Mr.  Client");
stackholder.Add("Manager", "Mr. Joy");
stackholder.Add("Team Leader", "Mr.Toy");
stackholder.Add("Sr. developer", "Mr.dojoy");
stackholder.Add("developer", "Mr. nodoy");
ViewBag.stackholder = stackholder;

List<string> modules = new List<string>();
modules.Add("Admin module");
modules.Add("ShoppingCart module");
modules.Add("CMS module");
ViewBag.modules = modules;
return View();
}

在UsingViewBagInControlAndViewDataInView.cshtml中使用ViewData来取值:

<h1>@ViewData["Title"]</h1>
<div>
<div>
<h2>Project Name : @ViewData["ProjectName"]</h2>
</div>
<div>
ProjectDescription :
<p>"@ViewData["ProjectDescription"]".</p>
</div>
<div>
Stack Holder :
<br />

<ul id="stakholder">
@foreach ( var stakerholder in ViewData["stackholder"] as Dictionary<string, string> )
{
<li>
@stakerholder.Key   : @stakerholder.Value
</li>
}
</ul>
</div>
<div>
Project Details:<br />
<div>
module List  :
<ul id="modulelist">
@foreach ( var module in ViewData["modules"] as List<string> )
{
<li>
@module
</li>
}
</ul>

</div>
Project StartDate : @ViewData["StartDate"]  <br />
Project TotalPrice: @ViewData["TotalPrice"] <br />
Project TotaDays  : @ViewData["TotalDays"]
</div>
</div>

反过来是这样的:

public ActionResult UsingViewDataInControlAndViewBagInView()
{
ViewData["Title"] = " Using ViewData In Control And ViewBag In View";
ViewData["ProjectName"] = "My Test Project";
ViewData["ProjectDescription"] = "This is Test Project to demo Viewdata and viewbag details";
ViewData["StartDate"] = new DateTime(2011, 1, 1);
ViewData["TotalPrice"] = 1000;
ViewData["TotalDays"] = 100;
Dictionary<string, string> stackholder = new Dictionary<string, string>();
stackholder.Add("Client", "Mr.  Client");
stackholder.Add("Manager", "Mr. Joy");
stackholder.Add("Team Leader", "Mr.Toy");
stackholder.Add("Sr. developer", "Mr.dojoy");
stackholder.Add("developer", "Mr. nodoy");
ViewData["stackholder"] = stackholder;

List<string> modules = new List<string>();
modules.Add("Admin module");
modules.Add("ShoppingCart module");
modules.Add("CMS module");
ViewData["modules"] = modules;
return View();
}

在UsingViewDataInControlAndViewBagInView.cshtml 的View中使用ViewBag来取值:

<h1>@ViewBag.Title</h1>
<div>
<div>
<h2>Project Name : @ViewBag.ProjectName</h2>
</div>
<div>
ProjectDescription :
<p>"@ViewBag.ProjectDescription.</p>
</div>
<div>
Stack Holder :
<br />

<ul id="stakholder">
@foreach ( var stakerholder in ViewBag.stackholder )
{
<li>
@stakerholder.Key   : @stakerholder.Value
</li>
}
</ul>
</div>
<div>
Project Details:<br />
<div>
module List  :
<ul id="modulelist">
@foreach ( var module in ViewBag.modules )
{
<li>
@module
</li>
}
</ul>

</div>
Project StartDate : @ViewBag.StartDate.ToString("dd-MMM-yyyy") <br />
Project TotalPrice: @ViewBag.TotalPrice  ₹  <br />
Project TotaDays  : @ViewBag.TotalDays
</div>
</div>

这样对比看上去会比较清楚一些。在源代码中的ViewBag是这样的属性:

public dynamic ViewBag {
get {
if (_dynamicViewData == null) {
_dynamicViewData = new DynamicViewDataDictionary(() => ViewData);
}
return _dynamicViewData;
}
}

ViewData是:

public ViewDataDictionary ViewData {
get {
if (_viewData == null) {
SetViewData(new ViewDataDictionary());
}
return _viewData;
}
set {
SetViewData(value);
}
}

具体细节在这儿不深入了,这里只是抛砖引玉。希望对您Asp.net MVC开发有帮助。

作者:Petter Liu 出处:http://www.cnblogs.com/wintersun/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 该文章也同时发布在我的独立博客中-Petter Liu Blog
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: