在这次云平台系统中,我们用到了大量的json传值方式,却忽略了MVC中自带的最传统的传值方式ViewData和ViewBag,之前在做任务详情显示的时候,用到了viewData传值,但是当时并不理解,闲暇时刻,查些资料,了解一下ViewData和ViewBag。
ViewData | ViewBag |
它是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 ActionResultUsingViewData()
{
ViewData["Title"] =" Using ViewData";
ViewData["ProjectName"] ="My Test Project";
ViewData["ProjectDescription"] ="This is Test Project to demo Viewdata and viewbagdetails";
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();
}
对应UsingViewDataView的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 inViewData["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 ActionResultUsingViewBag()
{
ViewBag.Title = " Using ViewBag";
ViewBag.ProjectName = "My Test Project";
ViewBag.ProjectDescription = "This is Test Project to demoViewdata 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();
}
对应ViewUsingViewBag 的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 inViewBag.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 ActionResultUsingViewBagInControlAndViewDataInView()
{
ViewBag.Title = " Using ViewBag In Control AndViewData In View";
ViewBag.ProjectName = "My Test Project";
ViewBag.ProjectDescription = "This is Test Project to demoViewdata 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 inViewData["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 ActionResultUsingViewDataInControlAndViewBagInView()
{
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 viewbagdetails";
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 inViewBag.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 ViewDataDictionaryViewData {
get {
if (_viewData==null) {
SetViewData(new ViewDataDictionary());
}
return _viewData;
}
set {
SetViewData(value);
}
}
在这次云平台系统中,由于前台使用的是EasyUI,所以用到了大量的Json传值,对ViewData和ViewBag用到的很少。此文有摘抄嫌疑。算是对ViewData和ViewBag进行总结了。