ASP.NET MVC教程四:ASP.NET MVC中页面传值的几种方式
準備
在Models文件夾里面新添加Student實體類,用來模擬從Controller向View傳遞數據,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里面的數據傳遞到View。ViewData定義如下:
從上面的截圖中可以看出,ViewData里面存的是字典類型的數據,在查看ViewDataDictionary的定義:
注意:ViewDataDictionary繼承自IDictionary等接口,所以ViewData里面的Value值類型是object的,使用的時候需要進行類型轉換。
新建Controller,并命名為ViewDataDemo,該Controller用來模擬通過ViewData向View傳遞數據
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傳遞數據/// </summary>/// <returns></returns>public ActionResult Index(){// 1、將字符串傳遞到ViewViewData["Other"] = "通過ViewData向View傳遞字符串";// 2、通過KeyValuePair添加ViewData.Add(new KeyValuePair<string, object>("name","tom"));// 3、直接添加ViewData.Add("age", 23);// 4、傳遞集合到ViewViewData["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類型的,需要進行類型轉換// 常規寫法是先在這里進行類型轉換var list = ViewData["Data"] as List<Student>; }<h2>通過ViewData向View傳遞數據</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中出現的,ViewBag是動態(dynamic)類型的。
新建Controller,并命名為ViewBagDemo,該Controller用來模擬通過ViewBag向View傳遞數據。
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傳遞數據/// </summary>/// <returns></returns>public ActionResult Index(){// 通過ViewData傳值ViewData["name"] = "ViewData";// 傳遞集合到ViewViewData["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傳遞數據</h2> <div class="jumbotron"><div><div>Controller通過ViewBag向View傳遞數據</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版本才開始出現的,為了兼容以前的ViewData,所以這里雖然沒有定義ViewBag.Student,但是ViewBag可以使用ViewData里面定義的Data數據。
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傳遞數據/// </summary>/// <returns></returns>public ActionResult Index(){// 通過ViewData傳值//ViewData["name"] = "ViewData";// 傳遞集合到ViewViewData["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視圖顯示效果:
這時會發現,Index視圖里面顯示的都是ViewData的值了。
三、通過TempData傳值
新建Controller,并命名為TempDataDemo,該Controller用來模擬通過TempData向View傳遞數據。
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: TempDataDemopublic ActionResult Index(){// ViewDataViewData["Name"] = "tom";// ViewBageViewBag.Name = "Jon";// TempDataTempData["Name"] = "Andi";TempData["Stu"] = new Student(){ID = 5,Name = "沙悟凈",Age = 567,Sex = "男",Email = "4567890345@qq.com"};// 返回同名視圖return View();}} }?對應的Index視圖代碼:
@*引入Student的命名空間*@ @using MVCStudyDemo.Models; @{ViewBag.Title = "Index"; } @{// 類型轉換var stu = TempData["Stu"] as Student; }<h2>通過TempData向View傳遞數據</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: TempDataDemopublic ActionResult Index(int? id){// ViewDataViewData["Name"] = "tom";// ViewBageViewBag.Name = "Jon";// TempDataTempData["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>?在瀏覽器里面輸入下面的URL地址:http://localhost:9080/TempDataDemo/index,這就表示傳遞的id是null值,運行結果:
你會發現這時ViewData和ViewBag都取不到數據了,只有TempData可以取到數據,可以得出TempData和ViewData、ViewBag的區別:
TempData是基于session存儲的,單次請求數據不丟失(ViewData和ViewBag會丟失),后臺跨頁面傳值,只能用一次
四、Model傳值
在Action放過里面的View上面F12轉到定義:
可以看到View有很多重載,其中一種可以直接傳遞model,如上面截圖中紅框所示。
新建Controller,并命名為ModelDemo,該Controller用來模擬通過Model向View傳遞數據。
對應的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: ModelDemopublic ActionResult Index(){Student student = new Student(){ID = 5,Name = "沙悟凈",Age = 567,Sex = "男",Email = "4567890345@qq.com"};// 返回modelreturn 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>??運行結果:
?
轉載于:https://www.cnblogs.com/dotnet261010/p/11416941.html
總結
以上是生活随笔為你收集整理的ASP.NET MVC教程四:ASP.NET MVC中页面传值的几种方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据建模、分析、挖掘技术应用研修班的通
- 下一篇: redis笔记_源码_双端链表list