.Net MVC將Controller數(shù)據(jù)傳遞到View
一、通過ViewData傳值
MVC從開始版本就一直支持使用ViewData將Controller里面的數(shù)據(jù)傳遞到View。ViewData定義如下:
從上面的截圖中可以看出,ViewData里面存的是字典類型的數(shù)據(jù),在查看ViewDataDictionary的定義:
注意:ViewDataDictionary繼承自IDictionary等接口,所以ViewData里面的Value值類型是object的,使用的時(shí)候需要進(jìn)行類型轉(zhuǎn)換。
Controller代碼如下:
using MVCPassValue.Models; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCPassValue.Controllers { public class ViewDataDemoController : Controller { // GET: ViewDataDemo public ActionResult Index(int? id) { //1、將字符串傳遞到View ViewData["Other"] = "通過ViewData傳遞字符串"; // 2 ViewData.Add(new KeyValuePair<string, object>("Id", id ?? -1)); //3 ViewData.Add("name", "tom"); //4、將集合傳遞到View ViewData["Student"] = new List<Student>() { new Student { ID = 1, Name = "唐僧", Age = 34, Sex = "男", Email = "747976523@qq.com" }, new Student { ID = 2, Name = "孫悟空", Age = 635, Sex = "男", Email = "sunwukong@163.com" }, new Student { ID = 3, Name = "白骨精", Age = 4532, Sex = "女", Email = "74345523@qq.com" } }; return View(); } } }
View視圖如下:
@using MVCPassValue.Models; @{ ViewBag.Title = "Index"; } @{ // 這里是使用的Razor語法,寫的C#代碼 var stuViewData = ViewData["Student"] as List<Student>;//ViewData的value值是object類型的,這里需要進(jìn)行類型轉(zhuǎn)換 var other = ViewData["Other"]; } <div class="jumbotron"> <p> <div style="background-color:darkgreen"> <div> Controller通過ViewData向View傳遞數(shù)據(jù) </div> <div> 1、傳遞字符串 other:@other; </div> <div> 2、傳遞字符串 Id:@ViewData["Id"]; </div> <div> 3、傳遞字符串 name:@ViewData["name"]; </div> <div> 4、傳遞集合 @foreach (var item in stuViewData) { <div> ID:@item.ID??Name:@item.Name??Age:@item.Age??Sex:@item.Sex??Email:@item.Email </div> } </div> </div> </p> </div>
運(yùn)行結(jié)果:
二、通過ViewBag傳值
ViewBag是在MVC3中出現(xiàn)的,ViewBag是動(dòng)態(tài)(dynamic)類型的。
Controller代碼:
using MVCPassValue.Models; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCPassValue.Controllers { public class ViewBagDemoController : Controller { // GET: ViewBagDemo public ActionResult Index(int? id) { //1、將字符串傳遞到View ViewData["Other"] = "通過ViewData傳遞字符串"; // 2 ViewData.Add(new KeyValuePair<string, object>("Id", id ?? -1)); //3 ViewData.Add("name", "tom"); //4、將集合傳遞到View ViewData["Student"] = new List<Student>() { new Student { ID = 1, Name = "唐僧", Age = 34, Sex = "男", Email = "747976523@qq.com" }, new Student { ID = 2, Name = "孫悟空", Age = 635, Sex = "男", Email = "sunwukong@163.com" }, new Student { ID = 3, Name = "白骨精", Age = 4532, Sex = "女", Email = "74345523@qq.com" } }; #region 2、通過ViewBag傳值 ViewBag.name = "ViewBag"; ViewBag.Stu1 = new Student() { ID = 5, Name = "沙悟凈", Age = 567, Sex = "男", Email = "4567890345@qq.com" }; #endregion return View(); } } }
Index視圖代碼:
@using MVCPassValue.Models; @{ ViewBag.Title = "Index"; } @{ var stuViewData = ViewData["Student"] as List<Student>;//ViewData的value值是object類型的,這里需要進(jìn)行類型轉(zhuǎn)換 var other = ViewData["Other"]; } @{ var name = ViewBag.name; var stu = ViewBag.Stu1;//ViewBag是dynamic類型的,使用的時(shí)候不需要進(jìn)行類型轉(zhuǎn)換 var stuList = ViewBag.Student; } <div class="jumbotron"> <p> <div style="background-color:darkgreen"> <div> Controller通過ViewData向View傳遞數(shù)據(jù) </div> <div> 傳遞字符串 ViewData["name"]:@ViewData["name"]; </div> </div> </p> <p> <div style="background-color:crimson"> <div> Controller通過ViewBag向View傳遞數(shù)據(jù) </div> <div> 1、傳遞字符串 ViewBag.name:@name; </div> <div> 2、輸出stu <div> ID:@stu.ID??Name:@stu.Name??Age:@stu.Age??Sex:@stu.Sex??Email:@stu.Email </div> 3、輸出stuList @foreach (var item in stuList) { <div> ID:@item.ID??Name:@item.Name??Age:@item.Age??Sex:@item.Sex??Email:@item.Email </div> } </div> </div> </p> </div>
運(yùn)行結(jié)果;
看了上面的運(yùn)行結(jié)果,你可能會(huì)提出如下的兩個(gè)疑問:
1、Controller里面沒有定義ViewBag.Student,為什么在這里可以使用呢?
這是因?yàn)閂iewBag是從MVC3版本才開始出現(xiàn)的,為了兼容以前的ViewData,所以這里雖然沒有定義ViewBag.Student,但是ViewBag可以使用ViewData里面定義的Student。
2、ViewData["name"]和ViewBag.name的值是一樣的
在控制器里面明明設(shè)置的兩個(gè)值是不同的,但是為什么這里都變成一樣的了呢?這是因?yàn)閂iewData和ViewBag的屬性是重疊的,兩者都是字典類型的,一切以后面定義的屬性為準(zhǔn),即后面定義的會(huì)覆蓋前面定義的。
三、通過TempData傳值
先來看看下面的代碼:
using MVCPassValue.Models; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCPassValue.Controllers { public class TempDataDemoController : Controller { // GET: TempDataDemo public ActionResult Index() { ViewData["Name"] = "tom"; ViewBag.Name = "Jon"; TempData["Name"] = "Andi"; TempData["Stu"] = new Student() { ID = 5, Name = "沙悟凈", Age = 567, Sex = "男", Email = "4567890345@qq.com" }; return View(); } } }
index視圖代碼:
@using MVCPassValue.Models; @{ ViewBag.Title = "Index"; } @{ var stu = TempData["Stu"] as Student; } <div class="jumbotron"> <p> <div style="background-color:darkgreen"> <div> 傳遞字符串 ViewData["Name"]:@ViewData["Name"]; </div> </div> </p> <p> <div style="background-color:crimson"> <div> 1、傳遞字符串 ViewBag.Name:@ViewBag.Name; </div> </div> </p> <p> <div style="background-color:crimson"> <div> 1、傳遞字符串 TempData["Name"]:@TempData["Name"]; </div> 2、輸出stu <div> ID:@stu.ID??Name:@stu.Name??Age:@stu.Age??Sex:@stu.Sex??Email:@stu.Email </div> </div> </p> </div>
允許結(jié)果:
從上面的結(jié)果中可以看出:TempData的屬性值不會(huì)覆蓋上面定義的屬性值。那TempData還有什么作用呢?在看下面的代碼:
using MVCPassValue.Models; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCPassValue.Controllers { public class TempDataDemoController : Controller { // GET: TempDataDemo public ActionResult Index(int? id) { ViewData["Name"] = "tom"; ViewBag.Name = "Jon"; TempData["Name"] = "Andi"; TempData["Stu"] = new Student() { ID = 5, Name = "沙悟凈", Age = 567, Sex = "男", Email = "4567890345@qq.com" }; if (id == null) return RedirectToAction("TempDataTest"); else return View(); } public ActionResult TempDataTest() { return View(); } } }
TempDataTest視圖代碼:
@using MVCPassValue.Models; @{ ViewBag.Title = "TempDataTest"; } @{ var stu = TempData["Stu"] as Student; } <h2>TempDataTest</h2> <h3>ViewData["id"]:@ViewData["Id"]</h3> <h3>ViewData["Name"]:@ViewData["Name"]</h3> <h3>TempData["Name"]:@TempData["Name"];</h3> <h3>ID:@stu.ID??Name:@stu.Name??Age:@stu.Age??Sex:@stu.Sex??Email:@stu.Email</h3>
運(yùn)行結(jié)果:
你會(huì)發(fā)現(xiàn)這時(shí)ViewData取不到數(shù)據(jù)了,只有TempData可以取到數(shù)據(jù),可以得出TempData和ViewData、ViewBag的區(qū)別:
TempData是基于session存儲(chǔ)的,單次請(qǐng)求數(shù)據(jù)不丟失(ViewData和ViewBag會(huì)丟失),后臺(tái)跨頁面?zhèn)髦?,只能用一?/p>
四、Model傳值
controller代碼:
using MVCPassValue.Models; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCPassValue.Controllers { public class ModelDemoController : Controller { // GET: ModelDemo public ActionResult Index() { return View(new Student() { ID = 5, Name = "沙悟凈", Age = 567, Sex = "男", Email = "4567890345@qq.com" }); } } }
index視圖代碼:
@{ ViewBag.Title = "Index"; } @Model Student; <h2>Index</h2> <h3>ID:@Model.ID</h3> <h3>Name:@Model.Name</h3> <h3>Age:@Model.Age</h3> <h3>Sex:@Model.Sex</h3> <h3>Email:@Model.Email</h3>
運(yùn)行結(jié)果:
到此這篇關(guān)于MVC將Controller數(shù)據(jù)傳遞到View的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- ASP.NET Core MVC 依賴注入View與Controller
- ASP.NET Core Controller與IOC結(jié)合問題整理
- ASP.NET Core對(duì)Controller進(jìn)行單元測(cè)試的完整步驟
- ASP.NET Core MVC如何實(shí)現(xiàn)運(yùn)行時(shí)動(dòng)態(tài)定義Controller類型
- ASP.NET Core中的Controller使用示例
- asp.net MVC 在Controller控制器中實(shí)現(xiàn)驗(yàn)證碼輸出功能
- asp.net mvc 動(dòng)態(tài)編譯生成Controller的方法
相關(guān)文章
ajaxToolkit:TextBoxWatermarkExtender演示與實(shí)現(xiàn)代碼
該控件的效果就是在TextBox控件上添加“水印”效果,也就是當(dāng)TextBox為空時(shí),顯示提示消息,一旦TextBox聚焦,樣式就消失,看起來還挺不錯(cuò)的嗎,感興趣的你可以了解下哦,希望本文對(duì)你有所幫助2013-01-01asp.net 站點(diǎn)URLRewrite使用小記
asp.net的底層運(yùn)作已經(jīng)也亂談過一番, 今天記一下URLRewrite的方法。2009-11-11Asp.NEt郵箱驗(yàn)證修改密碼通過郵箱找回密碼功能
這篇文章主要介紹了Asp.NEt郵箱驗(yàn)證修改密碼通過郵箱找回密碼功能,需要的朋友可以參考下2017-10-10以IP來獲取客戶端電腦名稱(一句代碼實(shí)現(xiàn))
項(xiàng)目要求需要獲取客戶端的電腦名稱,根據(jù)客戶要求實(shí)現(xiàn)以下想法,感興趣的朋友可以參考此文,希望對(duì)你有所幫助2013-01-01