您的位置:首页 > 其它

MVC中 ViewData、ViewBag、TempData的区别与联系

2013-02-05 00:39 447 查看

ViewData和TempData都可以传递弱类型数据,区别如下:

ViewData 只在当前 Action 中有效,生命周期和 View 相同;TempData 的数据至多只能经过一次Controller传递,并且每个元素至多只能被访问一次,访问以后,自动被删除。TempData 一般用于临时的缓存内容或抛出错误页面时传递错误信息,可以将TempData 在使用之前存储到相应的 ViewData 中以备循环使用。TempData 保存在Session中,Controller每次执行请求的时候,会从Session中先获取 TempData,而后清除Session,获取完TempData数据,虽然保存在内部字典对象中,但是其集合中的每个条目访问一次后就从字典表中删 除。具体代码层面,TempData获取过程是通过SessionStateTempDataProvider.LoadTempData方法从 ControllerContext的Session中读取数据,而后清除Session,故TempData只能跨Controller传递一次。Index
public ActionResult Index(){ViewBag.Message = "Welcome to ASP.NET MVC!";ViewData["myName"] = "我的名字";TempData["myAgeOne"] = "26岁";TempData["myAgeTwo"] = "27岁";return View();}
姓名:@ViewData["myName"]<br />年龄1:@TempData["myAgeOne"]
About
姓名:@ViewData["myName"]<br />年龄1:@TempData["myAgeOne"]<br />年龄2:@TempData["myAgeTwo"]

ViewBag和ViewData区别与联系如下:

ViewBag.Name=ViewData["Name"];
相同:使用同一个字典集合(数据源)不同:ViewBag 是 MVC3 新增语法,ViewBag 不再是字典的键值对结构,而是 dynamic 动态类型,它会在程序运行的时候动态解析。三者相比之下ViewBag 和ViewData生命周期相同,也是对但前View有效,不同的是ViewBag的类型不再是字典的键值对结构,而是dynamic动态类型,属于Mvc3里面新增的部分。具体请看以下代码:在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开发有帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: