你的位置:首页 > ASP.net教程

[ASP.net教程]在Asp.net MVC 3 web应用程序中,我们会用到ViewData与ViewBag,对比一下:


Asp.net MVC中的ViewData与ViewBag



 

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 &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 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 &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 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 &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 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 &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 ViewDataDictionary ViewData {  get {    if (_viewData == null) {      SetViewData(new ViewDataDictionary());    }    return _viewData;  }  set {    SetViewData(value);  }}

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