[ASP.NET Core] MVC

MVC

一些笔记

WebApplication

概念性的内容在概述里,不过多阐述了

Middleware

一些常用中间件介绍

UseStaticFiles()

为当前请求路径启用静态文件服务的支持

默认静态文件存放在wwwroot目录,可以通过方法重载传入StaticFileOptions或者字符串表示的相对路径来添加额外的静态文件目录

该中间件如果处理成功会打断管线,直接返回给客户端。也就是说之后的中间件都不会执行了。

MapDefaultControllerRoute()

WebApplication.MapDefaultControllerRoute方法提供了默认的endpoint中间件,来分发用户请求到对应的处理方法中,它的模板是

{controller=Home}/{action=Index}/{id?}

Controller

ViewData

一个字典对象,用来设置View层的数据。

这种数据传递方式比较灵活。

ViewBag

一个dynamic类型的属性,用来设置View层的数据。

这种数据传递方式非常灵活。

View()

https://learn.microsoft.com/zh-cn/dotnet/api/microsoft.aspnetcore.mvc.controller.view

创建一个视图,有许多重载。

参数model用于传递视图数据(ViewModel)。

参数viewName指定view

通过viewName搜索视图有一定的规则,如果不传入viewName则通过以下顺序搜索:

  • Views/[ControllerName]/[ViewName].cshtml
  • Views/Shared/[ViewName].cshtml

详细搜索规则:https://learn.microsoft.com/zh-cn/aspnet/core/mvc/views/overview?view=aspnetcore-7.0#view-discovery

Razor

一种对标JSP的可使用C#/VB语言动态生成页面,详细在概述里

razor文件被称为view,用于展示数据

ViewData/ViewBag

弱类型的数据传递方式

Controller传来的同款ViewBag

https://learn.microsoft.com/zh-cn/aspnet/core/mvc/views/overview?view=aspnetcore-7.0#viewbag

根据文档,ViewBag在razor pages里是不能使用的,因此使用时机到底是用Data还是Bag需要权衡一下

使用这两个属性来传递数据都是弱类型数据

Model

Controller传来的ViewModel数据

在页面开始时使用@model来指定类型后,就可以在cshtml里启用代码提示了(

总之强类型的好处是高性能(免去dynamic/查表开销),代码提示,相对来说不那么灵活

(不灵活在某些场景下可能挺致命的(打工人的痛))

Layout

https://learn.microsoft.com/zh-cn/aspnet/core/mvc/views/layout

大多数 Web 应用都有一个通用布局,可在页面间切换时为用户提供一致体验。 该布局通常包括应用标头、导航或菜单元素以及页脚等常见的用户界面元素。

按照约定,布局的razor页面放在Shared/_Layout.cshtml文件里,编写好页面布局后使用RenderBody()方法来嵌入其他页面结构

在子页面中使用布局需要设置Layout属性。如果属性只传入名字,razor引擎会通过标准的视图搜索规则来搜索布局,该属性还可以传入完整路径。

ViewImports

约定_ViewImports.cshtml文件里的指令,例如using、model、namespace可以传染,像使用时就像C的#include预处理指令共享这些导入

每个ViewImports都只作用于同级别的cshtml文件

详细规则:https://learn.microsoft.com/zh-cn/aspnet/core/mvc/views/layout?view=aspnetcore-7.0#importing-shared-directives


[ASP.NET Core] MVC
https://ksgfk.github.io/2023/10/23/DotNet-MVC/
作者
ksgfk
发布于
2023年10月23日
许可协议