控制器向视图传数据
这一章开始,我们会学习控制器如何传输数据到视图展示。
什么叫做控制器向视图发送数据呢?
我们说过,视图只是负责页面的展示,而核心的功能实现都是在控制器实现。我们从视图向服务器发送操作请求后,需要控制器做一些处理,控制器做完处理后,需要返回结果在前端展示,这时候就需要“控制器向视图发送数据”了。
控制器向视图发送数据的三个方法
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传递“你好,王晓晓”到视图页面中展示。
需要购买本课才能留言哦~