71muke?v=1
在线看书
立即购买

第一章 ASP.NET MVC介绍

收起
2023-04-08更新,每天更一篇

第二章 视图和控制器的数据交互

收起
2023-04-08更新,每天更一篇

第三章 模型绑定的使用

收起
2023-04-08更新,每天更一篇

第四章 ASP.NET MVC中的表单辅助方法

收起
2023-04-08更新,每天更一篇

第五章 ASP.NET MVC的表单验证

收起
2023-04-08更新,每天更一篇

第六章 ASP.NET中的强类型

收起
2023-04-08更新,每天更一篇

第七章 ASP.NET MVC中使用Ajax

收起
2023-04-08更新,每天更一篇

第八章 在ASP.NET MVC中WebAPI的使用

收起
2023-04-08更新,每天更一篇

第九章 控制器和路由的使用

收起
2023-04-08更新,每天更一篇

第十章 用户管理的实战开发

收起
2023-04-08更新,每天更一篇

控制器向视图传数据

这一章开始,我们会学习控制器如何传输数据到视图展示。

什么叫做控制器向视图发送数据呢?

我们说过,视图只是负责页面的展示,而核心的功能实现都是在控制器实现。我们从视图向服务器发送操作请求后,需要控制器做一些处理,控制器做完处理后,需要返回结果在前端展示,这时候就需要“控制器向视图发送数据”了。


控制器向视图发送数据的三个方法

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>


运行效果:

image.png


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>

运行效果:

image.png


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。得到下面的结果:

image.png

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

image.png

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

image.png

补充知识点:dynamic类型的变量都会编译为object类型的变量。因此,dynamic类型只存在于编译时刻,而不存在于运行时刻。


完成了本课的学习,尝试的做一道作业题吧。

请分别使用ViewData、ViewBag、TempData传递“你好,王晓晓”到视图页面中展示。

留言

发布留言

需要购买本课才能留言哦~

{{ item.createtime | dateStr }}