.NET探索模型路由约定实现伪静态
概述
IPageRouteModelConvention接口用于自定义PageRouteModel,这个对象在Microsoft.AspNetCore.Mvc.ApplicationModels命名空间中,
代表着Razor Page路由设置,换句话说我们可以通过实现该接口覆盖默认的实现。
该接口需要实现一个成员void Apply(PageRouteModel model)。通过这个方法,我们可以访问有关当前路由设置的元数据,并根据需要对其内容进行修改。
下面示例,将解决提供一个伪静态的解决方案,因此我们可以通过index.html about.html....去访问我们的页面,也就是说我们可以从Index-Index.html的支持
public class HtmlExtensionPageRouteModelConvention : IPageRouteModelConvention
{
private readonly ILogger _logger;
public HtmlExtensionPageRouteModelConvention(ILogger logger)
{
_logger = logger;
}
public void Apply(PageRouteModel model)
{
var log = new StringBuilder();
log.AppendLine("====================================================");
log.AppendLine($"Count:{model.Selectors.Count} ViewEnginePath:{model.ViewEnginePath} RelativePath:{model.RelativePath}");
var selectorsCount = model.Selectors.Count;
for (var i = 0; i < selectorsCount; ++i)
{
var attributeRouteModel = model.Selectors[i].AttributeRouteModel;
//添加之前
log.AppendLine($"Template:{attributeRouteModel.Template}");
if (string.IsNullOrEmpty(attributeRouteModel.Template))
{
continue;
}
//该规则是否禁止链接的生成,默认为生成(支持TagHelpers) asp-page="/Index"
attributeRouteModel.SuppressLinkGeneration = true;
//添加新的路由模板
model.Selectors.Add(new SelectorModel
{
AttributeRouteModel = new AttributeRouteModel
{
//Order 路由匹配顺序
//SuppressLinkGeneration = true,
Template = $"{attributeRouteModel.Template}.html",
}
});
}
//添加完后
log.AppendLine($"Count:{model.Selectors.Count} ");
foreach (var item in model.Selectors)
{
log.AppendLine($"Template:{item.AttributeRouteModel.Template} ");
}
_logger.LogInformation(log.ToString());
}
}
在启动时,为所有可导航的Razor页面构建PageRouteModel。Apply方法接收这个对象,并访问于PageRouteModel相关联的SelectorModel对象集合。它们包含页面路由和任何约束的信息,在每个页面的selector集合中通常有一个SelectorModel,但可以有任意数量,默认页面为Index.cshtml通常有两个选择器,一个包含一个路由模板,由相对文件路径和"Index"组成,另一个模板中有一个空字符串,文件名通常放在那里(这使它成为文件夹的默认文件)。在这个例子中的Index.cshtml原始模板生成的(Index),将变成一个Index.html
我们需要将attributeRouteModel.SuppressLinkGeneration设置为true,禁止对链接的生成,默认值为false(支持TagHelpers如:asp-page="/Index"),
如下图所示鼠标箭头放到Home上面,在下面可以显示出来为我们生成的路径,这个路由则是根据我们设置的规则而生成出来的.
当我们在Selectors.Add方法内中的new AttributeRouteModel
对象中将SuppressLinkGeneration
设置为true,这样的话我们是将路由规则设置禁止了,看下图可以看出,
当我们把所有的规则都设置为禁止生成后,我们当鼠标剪头再次放到Home上面时已经不会为我们再生成新的链接了
添加约定
自定义约定要在Startup中的void ConfigureServices(IServiceCollection services)方法下中的 services.AddRazorPages()方法下追加RazorPagesOptions方法并添加约定的集合:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddRazorPages().AddRazorPagesOptions(options =>
{
//options.Conventions.AddPageRoute("/Index", "Index.html");
options.Conventions.Add(new HtmlExtensionPageRouteModelConvention(_loggerFactory.CreateLogger<HtmlExtensionPageRouteModelConvention>()));
});
}
通过如上代码,我们便在.NET中实现了伪静态,对URL路由匹配规则的附加操作.
https://github.com/hueifeng/BlogSample/tree/master/src/PageRouteModelConventionURLRewrite
.NET探索模型路由约定实现伪静态的更多相关文章
- CI中的url相关函数以及路由设置和伪静态技术
当使用CI框架进行开发时,我们的一些数据传递的URL不应该写死,可以使用如下方法:比如说我们需要表单提交一个数据: 1.在controller控制器中我们需要先创建一个加载helper和视图的方法: ...
- express 洋葱模型 路由管理 中间件
express 路由管理,通过 app.express(); app.METHOD(path,fn(req, res)的方式进行路由的配置.实现了请求的接口的路由的拆分.那么可以将路由配置,分发到不 ...
- CodeIgniter_2 路由中定义伪静态 直接映射到相关的控制器
某些情况下 隐藏路径信息 使用伪静态定义: RewriteRule ^no/torrent(.*)$ /index.php/torrent/doit/$1 CodeIgniter会自动识别到 no 控 ...
- MVC3.0,路由设置实现伪静态IIS中404错误
C# code? 1 2 3 4 5 routes.MapRoute("NewQueryTest.asp", "NewQueryTest ...
- mvc 路由伪静态实现
很多网站都采用伪静态,例如以html.shtml等结尾的url,mvc的路由可以轻松实现. 配置路由 默认路由配置 添加伪静态路由 mvc的路由原理是从上往下匹配的,所以只需要在后面添加自己配置的路由 ...
- asp.net core 系列 8 Razor框架路由(下)
三.页面路由操作约定 接着上篇讲asp.net core 系列 7 Razor框架路由.在上篇继续第三节 "页面路由操作约定" 的最后一小节 AddPageRoute . 3.3. ...
- asp.net core 系列 7 Razor框架路由(上)
一.概述 在上二篇中,主要是介绍了asp.net core mvc中路由的使用,这篇继续介绍路由在ASP.NET Core Razor中的使用.Razor Pages应该使用默认的传统路由,从应用程序 ...
- ASP.NET Core路由中间件[3]: 终结点(Endpoint)
到目前为止,ASP.NET Core提供了两种不同的路由解决方案.传统的路由系统以IRouter对象为核心,我们姑且将其称为IRouter路由.本章介绍的是最早发布于ASP.NET Core 2.2中 ...
- asp.net MVC URL路由入门指南
asp.net MVC 的URL路由是一个非常强大的功能,而且有个优点:强大单不复杂.然而,目前我在网上看到的相关资料,却都仅仅提供一些示例,仅通过这些示例,初学者基本上不可能明白为什么要这么配置,更 ...
随机推荐
- 单机模拟配置Eureka集群
首先先提醒单机部署的重要点 如果使用一个ip地址(适用于单网卡)每个eureka实例使用不同的域名映射到同一个IP 如果每个eureka实例使用不同的IP(多网卡),要确保这些IP要都表示本地 本文假 ...
- Django(命名空间)
命名空间 命名空间(英语:Namespace)是表示标识符的可见范围.一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的.这样,在一个新的命名空间中可定义任何标识符,它们不会与任何 ...
- SQL系列总结——基础篇(二)
表达式:是符号与运算符的组合,一个常量,变量.列或标量函数就是一个简单的表达式,复杂的表达式由两个或更多的简单表达式通过运算符连接起来组成.运算符同样的遵循优先级的原则.作用,让SQL的 ...
- php之bindValue和bindParam的区别
PDOStatement::bindValue - 把一个值绑定到一个参数 绑定一个值到用作预处理的 SQL 语句中的对应命名占位符或问号占位符. PDOStatement::bindParam - ...
- [SpringSecurity] UserDetailsService 详解
UserDetailsService 接口 当什么也没有配置的时候,账号和密码是由 Spring Security 定义生成的. 而在实际项目中账号和密码都是从数据库中查询出来的. 所以我们要通过自定 ...
- Flink-v1.12官方网站翻译-P027-State Schema Evolution
状态方案的演变 Apache Flink流媒体应用通常被设计为无限期或长时间运行.与所有长期运行的服务一样,应用程序需要更新以适应不断变化的需求.这对于应用程序所针对的数据模式也是一样的,它们会随着应 ...
- Educational Codeforces Round 84 (Div. 2)
Educational Codeforces Round 84 (Div. 2) 读题读题读题+脑筋急转弯 = =. A. Sum of Odd Integers 奇奇为奇,奇偶为偶,所以n,k奇偶性 ...
- Java——方法及构造方法、intellij IDEA中的一些快捷键
intellij IDEA中的一些快捷键: 一.方法基础 给你一个两个int类型的数相加的例子: 这个例子说明了 public static void main(String[] args) {}相当 ...
- 洛谷-P1469 找筷子 (位运算)
题意:给你一组数,求数组中唯一的出现次数为奇数的那个数. 题解:这题其实直接桶排一下就行了,但是最后一个点会TLE. 后来了解到这题可以用位运算来解决: ^(异或)运算符:用于比较两个二进制数 ...
- Typora Themes自定义
Typora Themes自定义 Typora 支持css样式,自定义主题十分方便,修改自己的css文件,再放入其themes文件夹,重启Typora,即可看到自定义主题. Typora 官网,自定义 ...