asp.net core 系列 8 Razor框架路由(下)
三.页面路由操作约定
接着上篇讲asp.net core 系列 7 Razor框架路由。在上篇继续第三节 "页面路由操作约定" 的最后一小节 AddPageRoute 。
3.3. 配置页面路由AddPageRoute
使用 AddPageRoute 配置路由,该路由与指定页面关联, 使用指定的路由生成页面链接。 AddPageRoute 使用 AddPageRouteModelConvention 建立路由。
示例应用为 Privacy.cshtml 创建指向 /ThePrivacyPage 的路由:
- options.Conventions.AddPageRoute("/Privacy", "ThePrivacyPage/{text?}");
可以通过原有 /
Privacy默认路由访问“Privacy”页面。http://localhost:60397/Privacy
也可以通过上面自定义的页面路由访问Privacy页面。 http://localhost:60397/ThePrivacyPage
示例应用的“Privacy”页面自定义路由允许使用可选的 text
路由段 ({text?}
)。 该页面还在其 @page
指令中包含此可选段,以便访问者在 /
Privacy 路由中访问该页面。在呈现的页面中,为Privacy链接生成的 URL 显示了已更新的路由,如下所示:
四. 页面模型操作约定
实现 IPageApplicationModelProvider 的默认页面模型提供程序可调用约定,这些约定旨在为页面模型配置提供扩展点。 在生成和修改页面发现及处理方案时,可使用这些约定。这里继续使用上篇讲的 AddHeaderAttribute
类(一个ResultFilterAttribute)来应用响应标头。
4.1 文件夹应用模型约定
使用 AddFolderApplicationModelConvention 创建并添加 IPageApplicationModelConvention,后者可以为指定文件夹下的所有页面调用 PageApplicationModel 实例上的操作。 示例演示了如何使用 AddFolderApplicationModelConvention
将标头 OtherPagesHeader
添加到应用的OtherPages 文件夹内的页面:
- //文件夹应用模型约定
- options.Conventions.AddFolderApplicationModelConvention("/OtherPages", model =>
- {
- model.Filters.Add(new AddHeaderAttribute(
- "OtherPagesHeader", new string[] { "OtherPages Header Value" }));
- });
在OtherPages/Page1
中请求示例的 Page1 页面,并检查标头以查看结果:
4.2 页面应用模型约定
使用AddPageApplicationModelConvention创建并添加IPageApplicationModelConvention ,它在调用操作PageApplicationModel页使用指定的名称。示例演示了如何使用 AddPageApplicationModelConvention 将标头 AboutHeader 添加到“About”页面:
- //页面应用模型约定
- options.Conventions.AddPageApplicationModelConvention("/Privacy", model =>
- {
- model.Filters.Add(new AddHeaderAttribute(
- "PrivacyHeader", new string[] { "Privacy Header Value" }));
- });
请求示例的 Privacy页面,并检查标头以查看结果:
4.3 配置筛选器
ConfigureFilter 可配置要应用的指定筛选器。 用户可以实现筛选器类,但示例应用演示了如何在 Lambda 表达式中实现筛选器,该筛选器在后台作为可返回筛选器的工厂实现:
- options.Conventions.ConfigureFilter(model =>
- {
- if (model.RelativePath.Contains("OtherPages/Page2"))
- {
- return new AddHeaderAttribute(
- "OtherPagesPage2Header",
- new string[] { "OtherPages/Page2 Header Value" });
- }
- return new Pages.OtherPages.EmptyFilter();
- });
- public class EmptyFilter : IActionFilter
- {
- public void OnActionExecuting(ActionExecutingContext context)
- {
- // do something before the action executes
- }
- public void OnActionExecuted(ActionExecutedContext context)
- {
- // do something after the action executes
- }
- }
页面应用模型用于检查指向 OtherPages 文件夹中 Page2 页面的段的相对路径。 如果条件通过,则添加标头。 如果不通过,则应用 EmptyFilter
。由于 Razor 页面会忽略操作筛选器,因此,如果路径不包含 OtherPages/Page2
,EmptyFilter
会按预期发出空操作指令。
在OtherPages/Page2中请求示例的 Page2 页面,并检查标头以查看结果:
4.4 配置筛选器工厂
除了4.3的 Lambda 表达式配置筛选器。还可以对ConfigureFilter 配置指定的工厂,以将筛选器应用于所有 Razor 页面。示例应用说明如何使用筛选器工厂将具有两个值的标头 FilterFactoryHeader 添加到应用的页面:
- options.Conventions.ConfigureFilter(new AddHeaderWithFactory());
- public class AddHeaderWithFactory : IFilterFactory
- {
- // Implement IFilterFactory
- public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
- {
- return new AddHeaderFilter();
- }
/// <summary>
/// IResultFilter继承了IFilterMetadata接口
/// </summary>
- private class AddHeaderFilter : IResultFilter
- {
- public void OnResultExecuting(ResultExecutingContext context)
- {
- context.HttpContext.Response.Headers.Add(
- "FilterFactoryHeader",
- new string[]
- {
- "Filter Factory Header Value 1",
- "Filter Factory Header Value 2"
- });
- }
- public void OnResultExecuted(ResultExecutedContext context)
- {
- }
- }
- public bool IsReusable
- {
- get
- {
- return false;
- }
- }
- }
在/About
中请求示例的“About
”页面,并检查标头以查看结果:
五.替换默认的页面应用模型
Razor 页面使用 IPageApplicationModelProvider 接口创建 DefaultPageApplicationModelProvider。 用户可以从默认模型提供程序继承,以便为处理程序提供自己的实现逻辑。 默认实现是:“未命名的处理程序方法”和“默认已命名处理程序的约定方法。
5.1 默认的未命名处理程序方法
未命名处理程序方法是以:Http 谓词为处理的程序方法,遵循以下约定:On<HTTP verb>[Async]
(追加 Async
是可选操作,但建议为异步方法执行此操作)。主要的三个Http 谓词:get、post、delete。
未命名处理程序方法 |
操作 |
OnGet/OnGetAsync |
初始化页面状态 |
OnPost/OnPostAsync |
处理 POST 请求。 |
OnDelete/OnDeleteAsync |
处理 DELETE 请求。 |
例如在index页面,实现post提交,示例如下:
- <form method="post" >
- <input type="submit" value="新增"
- class="btn btn-danger"
- asp-route-id="1" />
- </form>
- [HttpPost]
- public async Task<IActionResult> OnPostAsync(int id)
- {
- await SaveAsync(id);
- // RedirectToPageResult实现了IActionResult接口
- RedirectToPageResult result = RedirectToPage();
- return result;
- }
5.2 默认的已命名处理程序方法
由开发人员提供的处理程序方法,遵循的约定是: On<HTTP verb><handler name>[Async], 处理程序名称出现在 Http 谓词之后或者 Http 谓词与 Async 之间。 例如,提交一个处理程序方法名为Message,那命名约定是OnPostMessage/OnPostMessageAsync。
- <form method="post">
- <input type="submit" value="消息提交"
- class="btn btn-danger"
- asp-route-id="1" asp-page-handler="Message" />
- </form>
- public async Task<IActionResult> OnPostMessageAsync(int id)
- {
- await SaveAsync(id);
- return RedirectToPage();
- }
注意:OnPostMessageAsync上面不用加http谓词。在页面asp-page-handler必须指定后台处理程序方法名。
5.3 自定义处理程序方法名称
上面的处理程序方法都是需要按照默认约定,才能关联起来。使用自定义处理程序可以让用户更改未命名和已命名的程序方法的命名方式。 假设:避免让方法名称以“On”开头,并使用第一个分词来确定 Http 谓词,比如将DELETE、PUT 和 PATCH 的谓词转换为 POST。这样程序可以提供下表所示的方法名称。
处理程序方法 |
操作 |
Get |
初始化页面状态 |
Post/PostAsync |
处理 POST 请求 |
PostMessage/PostMessageAsync |
POST 消息 |
DeleteMessage/DeleteMessageAsync |
OST 消息以进行删除 |
PutMessage/PutMessageAsync |
POST 消息以进行放置 |
若要建立此方案,请从 DefaultPageApplicationModelProvider 类继承并重写 CreateHandlerModel 方法,以提供自定义逻辑来解析 PageModel 处理程序名称。 示例应用展示了如何在其 CustomPageApplicationModelProvider 类中执行此操作:
当CustomPageApplicationModelProvider类继承DefaultPageApplicationModelProvider想重写处理程序方法名称时,vs提示错误:DefaultPageApplicationModelProvider不可访问,因为它具有一定保护级别。保护级别如下图所示:
在实际项目中,一般也不会自定义处理程序方法名称,遵循既有的方法名约定都能满足开发业务。这里的实现以后在考虑吧。
参考文献
官方资料:asp.net core routing
asp.net core 系列 8 Razor框架路由(下)的更多相关文章
- asp.net core 系列 7 Razor框架路由(上)
一.概述 在上二篇中,主要是介绍了asp.net core mvc中路由的使用,这篇继续介绍路由在ASP.NET Core Razor中的使用.Razor Pages应该使用默认的传统路由,从应用程序 ...
- asp.net core 系列 6 MVC框架路由(下)
一.URL 生成 接着上篇讲MVC的路由,MVC 应用程序可以使用路由的 URL 生成功能,生成指向操作的 URL 链接. 生成 URL 可消除硬编码 URL,使代码更稳定.更易维护. 此部分重点介绍 ...
- asp.net core 系列 5 MVC框架路由(上)
一. 概述 介绍asp.net core路由时,我初步想了下,分几篇来说明. 路由的知识点很多,参考了官方文档提取出一些重要的知识点来说. 在ASP.NET Core中是使用路由中间件来匹配传 ...
- asp.net core系列 39 Razor 介绍与详细示例
原文:asp.net core系列 39 Razor 介绍与详细示例 一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor ...
- 【目录】asp.net core系列篇
随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...
- asp.net core系列 39 Web 应用Razor 介绍与详细示例
一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor. 这样开发Web包括了MVC框架和Razor框架.对于Razor来说 ...
- 【asp.net core 系列】4. 更高更强的路由
0. 前言 在之前我们介绍了请求通过路由寻找到控制器,以及控制器与视图的数据流转.那么,我们回过头来,再看看路由的一些其他用法. 1. 路由属性(Route Attribute) 按照英文的直接翻译, ...
- 【asp.net core 系列】2 控制器与路由的恩怨情仇
0. 前言 在上一篇文章中,我们初步介绍了asp.net core,以及如何创建一个mvc项目.从这一篇开始,我将为大家展示asp.net core 的各种内容,并且尝试带领大家来挖掘其中的内在逻辑. ...
- asp.net core系列 40 Web 应用MVC 介绍与详细示例
一. MVC介绍 MVC架构模式有助于实现关注点分离.视图和控制器均依赖于模型. 但是,模型既不依赖于视图,也不依赖于控制器. 这是分离的一个关键优势. 这种分离允许模型独立于可视化展示进行构建和测试 ...
随机推荐
- html基础学习1
<html> <head> <title>标题</title> </head> <body bgcolor="pink&qu ...
- ImCash是骗局吗?到底是真是假?
关于风靡北美的ImCash是不是骗局,ImCash项目安全靠谱么?下面我将为你分析: 今天关于北美ImCash量子基金这个项目谈谈我个人的看法: 首先选择项目我最先看的是制度,如果奖金制度不好,其他的 ...
- notes for python简明学习教程(2)
方法是只能被该类调用的函数 print函数通常以换行作为输出结尾 字典的items方法 返回的是元组列表 即列表中的每个元素都是元组 切片左闭右开 即开始位置包含在切片中 结束位置不在 每一个对象都能 ...
- JAVA基础复习与总结<八> 缓冲流_数据流_对象流_IO总结
缓冲流.数据流以及对象流 一.缓冲流 缓冲流的概念:在读写的时候,对于单字节的读取会造成硬盘的频繁读写,增加访问次数,降低了读取文件的效率.而引入缓冲流之后,就可以将多个字节写入缓冲区,在缓冲区积累之 ...
- [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)
Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...
- It is difficult to the point of impossiblity for sb to image a time when ...
对sb而言很难想象一段..的时光.
- Linux系统下zookeeper的安装和配置
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...
- mysql命名规范
1.数据库表命名规范: (1)表名前应该加上前缀,表的前缀一个用系统或模块的英文名称缩写,前缀全部大写或首字母大写,表名中包含的单词首字母大写. (2)数据库表名应该有意义,并且易于理解,最好使用可以 ...
- JS中[object object]怎么取值
错误信息:本来是要显示JSON对象的 结果控制台打印了[object object] 需要做一个简单的转换,如下: var jsonData = JSON.stringify(data);// 转成 ...
- Tomcat7在centos7.3上正常运行,在centos7.2就不行了
我在jdk1.7的环境下,把一个tomcat7从一台centos7.3的服务器迁移到7.2,理论上讲 迁移完成之后只要端口没有被占用,环境变量配置完成,Tomcat是可以正常启动的(空的Tomcat ...