云平台--沉淀:ViewData 和ViewBag

在这次云平台系统中,我们用到了大量的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&nbsp; : @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&nbsp;:@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&nbsp; : @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&nbsp; : @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进行总结了。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值