ASP.NET Core 视图
花了几章节,终于把 ASP.NET Core MVC 中的 C 控制器涉及的七七八八了,本章节我们来学习下 V,也就是视图部分。
ASP.NET Core MVC 应用程序中,没有任何内容像页面,并且在 URL 中指定路径时, 它也不包含与页面直接对应的任何内容。 ASP.NET Core MVC 应用程序中最接近页面的东西被称为视图
是不是很拗口,哈哈,页面就是一个服务器端返回的数据,但这个数据并不是直接存在的,而是由控制器、模型、视图三大部分相作用的结果。
这是因为,也是你知道的,在 ASP.NET MVC 应用程序中,所有传入的请求均由控制器处理,并将这些请求映射到控制器相应的方法上
控制器方法可能会返回一个视图,也可能执行其它类型的操作,例如重定向到另一个控制器方法上
如果使用 MVC 框架,最流行的创建 HTML 的方法是使用 ASP.NET MVC 的 Razor 视图引擎
为了使用 Razor 视图引擎,一个控制器方法将产生一个 ViewResult 对象,而一个 ViewResult 可以携带我们想要使用的 Razor 视图的名称
该视图是文件系统上的文件,且 ViewResult 还可以将一个模型对象带到视图中,且视图可以在创建 HTML 时使用该模型对象
当 MVC 框架看到控制器方法返回一个 ViewResult 时,框架将在文件系统上查找对应的视图,执行视图生成 HTML,然后框架会将这个 HTML 作为响应发送回客户端
ASP.NET MVC 视图范例
现在,我们通过一个简单的范例来了解视图如何在我们的应用程序中工作
我们将更改 HomeController
类中的 Index
方法,返回一个 ViewResult
对象
完整代码如下
using System; using Microsoft.AspNetCore.Mvc; using HelloWorld.Models; namespace HelloWorld.Controllers { public class HomeController: Controller { public ViewResult Index() { var employee = new Employee { ID = 1, Name = "语飞"}; return View(); } } }
在 HomeController
中,不再是生成 ObjectResult
,而是返回 View()
方法返回的内容
View()
方法不返回 ObjectResult 对象,而是会创建一个新的 ViewResult 对象,
因此我们必须将 Index
方法的返回类型更改为 ViewResult
View()
方法可以接受一些可选的参数,当然了,我们调用这个方法时没有传递任何其它参数
我们保存下文件 HomeController.cs
,重启应用程序,刷新浏览器,显示结果如下
出错了,这个错误的意思是没有找到视图文件 Index.cshtml
不过我们可以从这个错误中发现很多有用的信息:
- 默认情况下,视图查找的路径,就是在根目录下的
Views
或Pages
目录下查找文件 - 默认情况下,C# ASP.NET Core MVC 项目中的视图以
.cshtml
作为扩展名 - 如果不提供其它任何信息,则视图位置和视图文件名将由 ASP.NET MVC 默认决定
- 如果我们需要从 HomeController 的 Index 操作中渲染视图,那么 MVC 框架查找该视图的第一个位置为
Views
文件夹 - 接下来,查找视图时将会检查控制器目录
Home
文件夹,查找名为Index.cshtml
的文件,文件名以Index
开头,因为我们处于Index
操作中 - 如果在控制器目录中没有找到对应视图,接下来会尝试在
Shared
文件夹中查找视图
为了使我们的视图结果正常工作,我们必须在正确的位置创建这个 Index.cshtml
文件。
因此,在我们的项目中,我们首先需要添加一个包含所有视图的文件夹,并将其命名为 Views
。
然后在 Views
文件夹中,我们将为与 HomeController
关联的视图添加另一个文件夹 Home
这些目录创建完成后,结果如下
接下来在右键点击 Home
目录,然后选择 添加 -> 新建文件 打开新建文件对话框
如果你的电脑是 Windows ,则是 添加 -> 新建项
在新建文件对话框中,选中左边的 ASP.NET Core,然后选中右边的 MVC 视图页面
如果你的电脑是 Windows ,则是先选中左边的 ASP.NET Core , 然后选中右边的 Razor 视图
在名称中输入 Index
或 Index.cshtml
( Windows 上 ),然后点击右下角的 新建 或 添加 ( Windows 上 ) 创建 Index.cshtml
视图文件
创建完成后,目录结构如下
Index.cshtml
中的内容如下
@* For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 *@ @{ }
现在,我们编辑下 Index.cshtml
,输入以下内容
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Home 控制器下的 Index 方法</title> </head> <body> <h1>欢迎!</h1> <div>这个消息来自 Home 控制器下的 Index 的视图文件 index.cshtml </div> </body> </html>
我们在 *.cshtml
中输入了 HTML 标记,这些 .cshtml
中的任何 HTML 标记都会被直接发送到客户端。
保存 Index.cshtml
文件,重启应用程序,刷新浏览器,可以看到输出如下
现在,Home 控制器通过 ViewResult
将该视图以及该 index.cshtml
文件中的所有标记呈现给客户端
视图参数
让我们回到 HomeController
控制器中的 View
方法
View()
方法有几个不同的重载,我们可以将员工模型作为参数传递给它
using System; using Microsoft.AspNetCore.Mvc; using HelloWorld.Models; namespace HelloWorld.Controllers { public class HomeController: Controller { public ViewResult Index() { var employee = new Employee { ID = 1, Name = "语飞"}; return View(employee); } } }
View()
方法只需要一个模型对象,并使用默认视图,即 Index
这里,我们只想传入该模型信息并在 Index.cshtml
中使用该模型
修改 Index.cshtml
,如以下程序中所示
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Home 控制器下的 Index 方法</title> </head> <body> <h1>欢迎!</h1> <div>这个消息来自 Home 控制器下的 Index 的视图文件 index.cshtml</div> <div>@Model.Name</div> </body> </html>
当我们在 Razor
视图中使用 @
符号时,Razor
视图引擎会将我们输入的任何内容视为 C# 表达式
Razor
视图包含一些我们可以在 C# 表达式中访问的内置成员,最重要的成员之一就是模型 ( Model )
但我们使用 @Model
时,意思就是使用从控制器传入视图的模型对象,因此 @ Model.Name
则表示在视图内显示员工姓名
保存所有的文件,重启应用程序,刷新浏览器,可以看到输出如下