ASP.NET MVC中Controller控制器向View視圖傳值的幾種方式
一、準(zhǔn)備工作
創(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的,使用的時候需要進行類型轉(zhuǎn)換。
新建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向?qū)?yīng)的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();
}
}
}對應(yīng)的View視圖代碼如下:
@*引入Student的命名空間*@
@using MVCStudyDemo.Models;
@{
ViewBag.Title = "Index";
// 這里使用的是Razor語法,寫的是后臺C#代碼
// ViewData的Value值是Object類型的,需要進行類型轉(zhuǎn)換
// 常規(guī)寫法是先在這里進行類型轉(zhuǎn)換
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>運行結(jié)果:

三、通過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();
}
}
}對應(yīng)的Index視圖代碼:
@*引入Student的命名空間*@
@using MVCStudyDemo.Models;
@{
ViewBag.Title = "Index";
// ViewBag是dynamic類型的,使用的時候不需要進行類型轉(zhuǎn)換
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>運行結(jié)果;

看了上面的運行結(jié)果,你可能會提出如下的兩個疑問:
1、Controller里面沒有定義ViewBag.Data,為什么在這里可以使用呢?
這是因為ViewBag是從MVC3版本才開始出現(xiàn)的,為了兼容以前的ViewData,所以這里雖然沒有定義ViewBag.Student,但是ViewBag可以使用ViewData里面定義的Data數(shù)據(jù)。
2、ViewData["name"]和ViewBag.name的值是一樣的
在控制器里面明明設(shè)置的兩個值是不同的,但是為什么這里都變成一樣的了呢?這是因為ViewData和ViewBag的屬性是重疊的,兩者都是字典類型的,一切以后面定義的屬性為準(zhǔn),即后面定義的會覆蓋前面定義的。
修改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();
}
}
}對應(yīng)的Index視圖代碼,TempData也是字典類型的,所以在View頁面中使用的時候也需要進行類型轉(zhuǎn)換:
@*引入Student的命名空間*@
@using MVCStudyDemo.Models;
@{
ViewBag.Title = "Index";
}
@{
// 類型轉(zhuǎn)換
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>運行結(jié)果:

從上面的結(jié)果中可以看出: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)
{
// 跳轉(zhuǎn)到TempDataTest方法
return RedirectToAction("TempDataTest");
}
else
{
// 返回同名視圖
return View();
}
}
public ActionResult TempDataTest()
{
// 返回同名視圖
return View();
}
}
}TempDataTest視圖代碼:
@*引入Student的命名空間*@
@using MVCStudyDemo.Models;
@{
ViewBag.Title = "TempDataTest";
// 類型轉(zhuǎn)換
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視圖,運行結(jié)果:

從結(jié)果會發(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轉(zhuǎn)到定義:

可以看到View有很多重載,其中一種可以直接傳遞model,如上面截圖中紅框所示。
新建Controller,并命名為ModelDemo,該Controller用來模擬通過Model向View傳遞數(shù)據(jù)。

對應(yīng)的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";
}
@*不需要進行類型轉(zhuǎn)換*@
<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>運行結(jié)果:

六、總結(jié)
最后總結(jié)一下ViewData和ViewBag的區(qū)別:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- .Net MVC將Controller數(shù)據(jù)傳遞到View
- ASP.NET Core MVC 依賴注入View與Controller
- ASP.NET?MVC項目部署方式介紹
- ASP.NET?MVC模式中應(yīng)用程序結(jié)構(gòu)詳解
- ASP.NET?MVC模式簡介
- ASP.NET MVC過濾器執(zhí)行順序介紹
- ASP.NET?MVC自定義操作過濾器
- ASP.NET MVC自定義授權(quán)過濾器
- ASP.NET?MVC自定義異常過濾器使用案例
- ASP.NET MVC自定義異常過濾器
- ASP.NET?MVC授權(quán)過濾器用法
- ASP.NET?MVC實現(xiàn)區(qū)域路由
相關(guān)文章
Visual Studio 2010 前端開發(fā)工具/擴展/插件推薦
這篇文章主要介紹了一組我喜愛的擴展和工具能讓Visual Studio在web開發(fā)方面更簡單,我只是集中在我安裝和使用過的一些工具,如果你還有其它好用的的話,請在這里留言。2016-06-06
談?wù)勅绾卧贏SP.NET Core中實現(xiàn)CORS跨域
本篇文章主要介紹了如何在ASP.NET Core中實現(xiàn)CORS跨域,CORS主要是解決Ajax跨域限制的問題,有興趣的可以了解一下。2016-12-12
關(guān)于中g(shù)ridview 字符串截取的方法
在Gridview中,如果你的某一列字符串的長度過長,不做處理的話.那么將顯示的奇丑無比,可以采取設(shè)置樣式,將其顯示為定長,可以在點擊查看的時候,在另一個頁面對其進行顯示2013-06-06

