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架构模式有助于实现关注点分离.视图和控制器均依赖于模型. 但是,模型既不依赖于视图,也不依赖于控制器. 这是分离的一个关键优势. 这种分离允许模型独立于可视化展示进行构建和测试 ...
随机推荐
- adjustResize模式下ExpandaleListView中输入框焦点错乱及布局底部的导航栏被顶在键盘上方的处理
为了更好的用户体验,煎熬了许久,得到这么个解决方案.在此记录下来,以供后来者参考. 第一部分 清单文件中组件activity的android:windowSoftInputMode属性值的含义: [A ...
- 四、OpenStack—glance组件介绍与安装
一.glance介绍 Glance是Openstack项目中负责镜像管理的模块,其功能包括虚拟机镜像的查找.注册和检索等. Glance提供Restful API可以查询虚拟机镜像的metadata及 ...
- url.cn短网址批量缩短开发接口
https://www.showapi.com/api/view/1728 //md5签名方式--非简单签名 <?php header("Content-Type:text/html; ...
- cgi、fast-cgi、php-pfm关系
CGI是一种规定了服务器和处理进程的数据传输格式的协议 如:nginx 和 php处理进程之间的数据传输是使用cgi格式来相互传输数据 CGI 是 接到请求,fork一条进程来处理,处理完后就退出. ...
- 【安全性测试】利用反编译查看对应activity的方法采用hook技术绑定劫持_入门
本次主要为了研究手机端的安全性而写的一篇文章,在基于自己对手机安全性的研究下,想到了这些工具之间的结合,当然这也算是第一次对手机安全研究勇敢地踏出一步,也不知道是否成功,还是准备撞南墙撞到底吧! 使用 ...
- TCP(控制传输协议)详解
1.传输层概述 在OSI参考模型中,网络层是面向通信的最高层但同时也是面向用户程序的最底层. 传输层的主要作用: 复用:在发送端,多个应用程序公用一个传输层: 分用:在接收端,传输层把从网络层接收到的 ...
- PHP 经典有趣的算法收集(面试题)
1.一群猴子排成一圈,按1,2,…,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫 ...
- 各个模块的刷新js
// 更新页面中的subgrid function refreshSubGrid(subgridName) { Xrm.Page.ui.controls.get(subgridName).refres ...
- LeetCode笔记:140. Word Break II
题目描述 给定一个非空的字符串s,一个非空的字符串list作为字典.通过在s中添加空格可以将s变为由list中的word表示的句子,要求返回所有可能组成的句子.设定list中的word不重复,且每一个 ...
- PHP 5.x和PHP 7 Closure不同行为问题
同样一段闭包代码,PHP 7 ok的,PHP 5.5.11(Windows 开发机器)上却报错,以为是PHP 5 bug,原来是用法不对,记录一下~ 原代码(自己写的框架的路由部分)最初是这样写的: ...