ASP.NET MVC中Controller控制器向View視圖傳值的幾種方式
一、準備工作
創(chuàng)建一個ASP.NET MVC程序,然后在Models文件夾里面新添加Student實體類,用來模擬從Controller向View傳遞數(shù)據(jù),Student類定義如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MVCStudyDemo.Models { public class Student { public int ID { get; set; } public string Name { get; set; } public int Age { get; set; } public string Sex { get; set; } public string Email { get; set; } } }
二、通過ViewData傳值
MVC從開始版本就一直支持使用ViewData將Controller里面的數(shù)據(jù)傳遞到View。ViewData定義如下:
從上面的截圖中可以看出,ViewData里面存的是字典類型的數(shù)據(jù),在查看ViewDataDictionary的定義:
注意:ViewDataDictionary繼承自IDictionary等接口,所以ViewData里面的Value值類型是object的,使用的時候需要進行類型轉換。
新建Controller,并命名為ViewDataDemo,該Controller用來模擬通過ViewData向View傳遞數(shù)據(jù)
Controller代碼如下:
using MVCStudyDemo.Models; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCStudyDemo.Controllers { public class ViewDataDemoController : Controller { // GET: ViewDataDemo /// <summary> /// 通過ViewData向對應的View傳遞數(shù)據(jù) /// </summary> /// <returns></returns> public ActionResult Index() { // 1、將字符串傳遞到View ViewData["Other"] = "通過ViewData向View傳遞字符串"; // 2、通過KeyValuePair添加 ViewData.Add(new KeyValuePair<string, object>("name","tom")); // 3、直接添加 ViewData.Add("age", 23); // 4、傳遞集合到View ViewData["Data"] = 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視圖代碼如下:
@*引入Student的命名空間*@ @using MVCStudyDemo.Models; @{ ViewBag.Title = "Index"; // 這里使用的是Razor語法,寫的是后臺C#代碼 // ViewData的Value值是Object類型的,需要進行類型轉換 // 常規(guī)寫法是先在這里進行類型轉換 var list = ViewData["Data"] as List<Student>; } <h2>通過ViewData向View傳遞數(shù)據(jù)</h2> <div class="jumbotron"> <div> <div> 1、傳遞字符串 other:@ViewData["Other"]; </div> <div> 2、傳遞字符串 name:@ViewData["name"]; </div> <div> 3、傳遞字符串 age:@ViewData["age"]; </div> <div> 4、傳遞集合方式一 @foreach (var item in list) { <div> ID:@item.ID??Name:@item.Name??Age:@item.Age??Sex:@item.Sex??Email:@item.Email </div> } </div> <div> 5、傳遞集合方式二 @foreach (var item in ViewData["Data"] as List<Student>) { <div> ID:@item.ID??Name:@item.Name??Age:@item.Age??Sex:@item.Sex??Email:@item.Email </div> } </div> </div> </div>
運行結果:
三、通過ViewBag傳值
ViewBag是在MVC3中出現(xiàn)的,ViewBag是動態(tài)(dynamic)類型的。
新建Controller,并命名為ViewBagDemo,該Controller用來模擬通過ViewBag向View傳遞數(shù)據(jù)。
Controller代碼:
using MVCStudyDemo.Models; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCStudyDemo.Controllers { public class ViewBagDemoController : Controller { // GET: ViewBagDemo /// <summary> /// 通過ViewBag向View傳遞數(shù)據(jù) /// </summary> /// <returns></returns> public ActionResult Index() { // 通過ViewData傳值 ViewData["name"] = "ViewData"; // 傳遞集合到View ViewData["Data"] = 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" } }; // 通過ViewBag傳值 ViewBag.Name = "ViewBag"; ViewBag.StudentData = new Student() { ID = 5, Name = "沙悟凈", Age = 567, Sex = "男", Email = "4567890345@qq.com" }; // 返回同名視圖 return View(); } } }
對應的Index視圖代碼:
@*引入Student的命名空間*@ @using MVCStudyDemo.Models; @{ ViewBag.Title = "Index"; // ViewBag是dynamic類型的,使用的時候不需要進行類型轉換 var stu = ViewBag.StudentData; var stuList = ViewBag.Data; } <h2>通過ViewBag向View傳遞數(shù)據(jù)</h2> <div class="jumbotron"> <div> <div> Controller通過ViewBag向View傳遞數(shù)據(jù) </div> <div> 1、通過ViewData傳遞字符串 ViewData["name"]:@ViewData["name"]; </div> <div> 2、通過ViewBag傳遞字符串 ViewBag.name:@ViewBag.Name; </div> <div> 3、輸出stu <div> ID:@stu.ID??Name:@stu.Name??Age:@stu.Age??Sex:@stu.Sex??Email:@stu.Email </div> 4、輸出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> </div>
運行結果;
看了上面的運行結果,你可能會提出如下的兩個疑問:
1、Controller里面沒有定義ViewBag.Data,為什么在這里可以使用呢?
這是因為ViewBag是從MVC3版本才開始出現(xiàn)的,為了兼容以前的ViewData,所以這里雖然沒有定義ViewBag.Student,但是ViewBag可以使用ViewData里面定義的Data數(shù)據(jù)。
2、ViewData["name"]和ViewBag.name的值是一樣的
在控制器里面明明設置的兩個值是不同的,但是為什么這里都變成一樣的了呢?這是因為ViewData和ViewBag的屬性是重疊的,兩者都是字典類型的,一切以后面定義的屬性為準,即后面定義的會覆蓋前面定義的。
修改Controller代碼,將ViewData的順序放到ViewBag后面:
using MVCStudyDemo.Models; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCStudyDemo.Controllers { public class ViewBagDemoController : Controller { // GET: ViewBagDemo /// <summary> /// 通過ViewBag向View傳遞數(shù)據(jù) /// </summary> /// <returns></returns> public ActionResult Index() { // 通過ViewData傳值 //ViewData["name"] = "ViewData"; // 傳遞集合到View ViewData["Data"] = 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" } }; // 通過ViewBag傳值 ViewBag.Name = "ViewBag"; ViewBag.StudentData = new Student() { ID = 5, Name = "沙悟凈", Age = 567, Sex = "男", Email = "4567890345@qq.com" }; // 把ViewData的順序放到ViewBag后面 ViewData["name"] = "ViewData"; // 返回同名視圖 return View(); } } }
在查看Index視圖顯示效果:
這時會發(fā)現(xiàn),Index視圖里面顯示的都是ViewData的值了。
四、通過TempData傳值
查看TempData的定義:
我們發(fā)現(xiàn)TempData也是字典類型的。
新建Controller,并命名為TempDataDemo,該Controller用來模擬通過TempData向View傳遞數(shù)據(jù)。
Controller代碼:
using MVCStudyDemo.Models; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCStudyDemo.Controllers { public class TempDataDemoController : Controller { // GET: TempDataDemo public ActionResult Index() { // ViewData ViewData["Name"] = "tom"; // ViewBage ViewBag.Name = "Jon"; // TempData TempData["Name"] = "Andi"; TempData["Stu"] = new Student() { ID = 5, Name = "沙悟凈", Age = 567, Sex = "男", Email = "4567890345@qq.com" }; // 返回同名視圖 return View(); } } }
對應的Index視圖代碼,TempData也是字典類型的,所以在View頁面中使用的時候也需要進行類型轉換:
@*引入Student的命名空間*@ @using MVCStudyDemo.Models; @{ ViewBag.Title = "Index"; } @{ // 類型轉換 var stu = TempData["Stu"] as Student; } <h2>通過TempData向View傳遞數(shù)據(jù)</h2> <div class="jumbotron"> <p> <div> <div> 通過ViewData傳遞字符串 ViewData["Name"]:@ViewData["Name"]; </div> </div> </p> <p> <div> <div> 通過ViewBag傳遞字符串 ViewBag.Name:@ViewBag.Name; </div> </div> </p> <p> <div> <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>
運行結果:
從上面的結果中可以看出:TempData的屬性值不會覆蓋上面定義的屬性值。那TempData還有什么作用呢?在看下面的代碼:
using MVCStudyDemo.Models; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCStudyDemo.Controllers { public class TempDataDemoController : Controller { // GET: TempDataDemo public ActionResult Index(int? id) { // ViewData ViewData["Name"] = "tom"; // ViewBage ViewBag.Name = "Jon"; // TempData TempData["Name"] = "Andi"; TempData["Stu"] = new Student() { ID = 5, Name = "沙悟凈", Age = 567, Sex = "男", Email = "4567890345@qq.com" }; if(id==null) { // 跳轉到TempDataTest方法 return RedirectToAction("TempDataTest"); } else { // 返回同名視圖 return View(); } } public ActionResult TempDataTest() { // 返回同名視圖 return View(); } } }
TempDataTest視圖代碼:
@*引入Student的命名空間*@ @using MVCStudyDemo.Models; @{ ViewBag.Title = "TempDataTest"; // 類型轉換 var stu = TempData["Stu"] as Student; } <h2>TempDataTest</h2> <h3>ViewData["Name"]:@ViewData["Name"]</h3> <h3>ViewBage.Name:@ViewBag.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>
我們先在瀏覽器里面輸入下面的地址:http://localhost:1098/TempDataDemo/index/12,這里給id傳值12,根據(jù)代碼,會顯示Index視圖:
我們看到:ViewData、ViewBag和TempData都可以取到值。
在瀏覽器里面輸入下面的URL地址:http://localhost:9080/TempDataDemo/index,這就表示傳遞的id是null值,根據(jù)代碼,會返回TempDataTest視圖,運行結果:
從結果會發(fā)現(xiàn)這時ViewData和ViewBag都取不到數(shù)據(jù)了,只有TempData可以取到數(shù)據(jù),可以得出TempData和ViewData、ViewBag的區(qū)別:
- ViewData和ViewBag不能跨Action方法使用,TempData可以跨Action方法使用,因為TempData是基于session存儲的。
- TempData只能跨Action方法訪問一次,再次訪問數(shù)據(jù)也會丟失。
五、Model傳值
在Action放過里面的View上面F12轉到定義:
可以看到View有很多重載,其中一種可以直接傳遞model,如上面截圖中紅框所示。
新建Controller,并命名為ModelDemo,該Controller用來模擬通過Model向View傳遞數(shù)據(jù)。
對應的controller代碼:
using MVCStudyDemo.Models; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCStudyDemo.Controllers { public class ModelDemoController : Controller { // GET: ModelDemo public ActionResult Index() { Student student = new Student() { ID = 5, Name = "沙悟凈", Age = 567, Sex = "男", Email = "4567890345@qq.com" }; // 返回model return View(student); // 或者直接返回 //return View(new Student() //{ // ID = 5, // Name = "沙悟凈", // Age = 567, // Sex = "男", // Email = "4567890345@qq.com" //}); } } }
Index視圖代碼:
@{ ViewBag.Title = "Index"; } @*不需要進行類型轉換*@ <h2>通過Model向View傳值</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>
運行結果:
六、總結
最后總結一下ViewData和ViewBag的區(qū)別:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
ASP.NET與ASP互通COOKIES的一點經(jīng)驗
ASP與ASP.NET互相整合時,其中文COOKIES信息無法被互通共享,當使用ASP.NET寫入中文COOKIES信息后,使用ASP進行讀取,讀出來的卻是亂碼,而非中文。2010-03-03asp.net Request.ServerVariables[] 讀解
asp.net Request.ServerVariables[] 讀解,學習.net的朋友可以參考下,方便獲取服務器的一些信息。2011-08-08Entity?Framework使用Fluent?API配置案例
本文詳細講解了Entity?Framework使用Fluent?API配置案例的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03ASP.Net中數(shù)據(jù)展示控件的嵌套使用示例
ASP.Net中數(shù)據(jù)展示控件的嵌套使用,在Repeater里面嵌套一個GridView,將每個User的任務展示出來2014-09-09ASP.NET?Core通過Microsoft.AspNetCore.App元包簡化程序集引用
這篇文章介紹了ASP.NET?Core通過Microsoft.AspNetCore.App元包簡化程序集引用的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07Hangfire在ASP.NET CORE中的簡單實現(xiàn)方法
下面小編就為大家分享一篇Hangfire在ASP.NET CORE中的簡單實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-11-11