[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文件