控制器向视图传数据
这一章开始,我们会学习控制器如何传输数据到视图展示。
什么叫做控制器向视图发送数据呢?
我们说过,视图只是负责页面的展示,而核心的功能实现都是在控制器实现。我们从视图向服务器发送操作请求后,需要控制器做一些处理,控制器做完处理后,需要返回结果在前端展示,这时候就需要“控制器向视图发送数据”了。
控制器向视图发送数据的三个方法
1、ViewData
ViewData也叫做ViewData属性,它在MVC 5中存放在ControllerBase类中,ViewData属性的定义定义如下:
public ViewDataDictionary ViewData { get; set; }
ViewData本身是ViewDataDictionary字典类型,其定义如下:
public class ViewDataDictionary : IDictionary<string, object>{}使用示例:
在控制器LoginController.cs控制器中的Index方法,添加如下代码:
public ActionResult Index()
{
//使用ViewData
ViewData["name"] = "张三";
return View(); //返回视图显示
}对应Index.cshtml视图,添加如下代码:
@{
ViewBag.Title = "Index";
Layout = null; //对当前页面设置不要布局页
}
<h2>Index</h2>
<h1>这是我创建的第一个视图</h1>
@* 使用ViewData *@
<p>我的名字:@ViewData["name"]</p>运行效果:

2、ViewBag
这个用得最多。
ViewBag对象是ASP.NET MVC 3提供的功能,它被声明为一个dynamic类型。
对应ASP.NET MVC 5源代码格式如下:
[Dynamic]
public dynamic ViewBag { get; }
须知:dynamic类型的变量都会编译为object类型的变量。因此,dynamic类型只存在于编译时刻,而不存在于运行时刻。
使用示例:
在控制器LoginController.cs下的test方法,添加如下代码:
public ActionResult test(string name)
{
//提示
ViewBag.notice = "你好啊~";
return View();
}在视图test.cshtml中添加如下代码:
@{
Layout = null;
}
<h1>张三,@ViewBag.notice</h1>运行效果:

3、TempData
ViewData属性与ViewBag属性无法跨Action方法传递数据,当需要在多个Action方法之间传递数据时,可采用TempData属性。
它在ASP.NET MVC 5源代码中声明和TempDataDictionary类的定义如下:
public TempDataDictionary TempData { get; set; }TempData为什么可以实现跨方法访问,是因为属性是将数据保存在Session中。
使用示例:
在LoginController.cs的Index方法中使用TempData。
public ActionResult Index()
{
//使用ViewData
ViewData["name"] = "张三";
//使用TempData
TempData["nick"] = "李四";
return View(); //返回视图显示
}
public ActionResult test(string name)
{
//提示
ViewBag.notice = "你好啊~";
return View();
}对应的test.cshtml视图代码:
@{
Layout = null;
}
@* 使用TempData变量 *@
<h1>张三,@ViewBag.notice , @TempData["nick"]</h1>运行代码,需要先运行/Login/Index。得到下面的结果:

再运行/Login/test,得到如下结果:

但是须知:当你再次刷新页面时,会发现这个值就不见了。只能生效一次。

补充知识点:dynamic类型的变量都会编译为object类型的变量。因此,dynamic类型只存在于编译时刻,而不存在于运行时刻。
完成了本课的学习,尝试的做一道作业题吧。
请分别使用ViewData、ViewBag、TempData传递“你好,王晓晓”到视图页面中展示。
毕设系统定制、课程教学、问题1对1远程解答,可联系村长QQ:330168885
需要购买本课才能留言哦~