IPageRouteModelConvention接口用於自定義PageRouteModel,這個對象在Microsoft.AspNetCore.Mvc.ApplicationModels命名空間中,
表明着Razor Page路由設置,換句話說咱們能夠經過實現該接口覆蓋默認的實現。
該接口須要實現一個成員void Apply(PageRouteModel model)。經過這個方法,咱們能夠訪問有關當前路由設置的元數據,並根據須要對其內容進行修改。
下面示例,將解決提供一個僞靜態的解決方案,所以咱們能夠經過index.html about.html....去訪問咱們的頁面,也就是說咱們能夠從Index-Index.html的支持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.htmlgit
咱們須要將attributeRouteModel.SuppressLinkGeneration設置爲true,禁止對連接的生成,默認值爲false(支持TagHelpers如:asp-page="/Index"),
以下圖所示鼠標箭頭放到Home上面,在下面能夠顯示出來爲咱們生成的路徑,這個路由則是根據咱們設置的規則而生成出來的.github
當咱們在Selectors.Add方法內中的new AttributeRouteModel
對象中將SuppressLinkGeneration
設置爲true,這樣的話咱們是將路由規則設置禁止了,看下圖能夠看出,
當咱們把全部的規則都設置爲禁止生成後,咱們當鼠標剪頭再次放到Home上面時已經不會爲咱們再生成新的連接了ui
自定義約定要在Startup中的void ConfigureServices(IServiceCollection services)方法下中的 services.AddRazorPages()方法下追加RazorPagesOptions方法並添加約定的集合:code
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路由匹配規則的附加操做.orm
https://github.com/hueifeng/BlogSample/tree/master/src/PageRouteModelConventionURLRewritehtm