1. 程式人生 > >.NET探索模型路由約定實現偽靜態

.NET探索模型路由約定實現偽靜態

## 概述 IPageRouteModelConvention介面用於自定義PageRouteModel,這個物件在Microsoft.AspNetCore.Mvc.ApplicationModels名稱空間中, 代表著Razor Page路由設定,換句話說我們可以通過實現該介面覆蓋預設的實現。 該介面需要實現一個成員void Apply(PageRouteModel model)。通過這個方法,我們可以訪問有關當前路由設定的元資料,並根據需要對其內容進行修改。 下面示例,將解決提供一個偽靜態的解決方案,因此我們可以通過index.html about.html....去訪問我們的頁面,也就是說我們可以從Index-Index.html的支援 ```csharp 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上面,在下面可以顯示出來為我們生成的路徑,這個路由則是根據我們設定的規則而生成出來的. ![file](https://hueifeng.com/uploads/img-177bf172-dc76-42d2-b64c-62c28a058451.png) 當我們在Selectors.Add方法內中的`new AttributeRouteModel`物件中將`SuppressLinkGeneration`設定為true,這樣的話我們是將路由規則設定禁止了,看下圖可以看出, 當我們把所有的規則都設定為禁止生成後,我們當滑鼠剪頭再次放到Home上面時已經不會為我們再生成新的連結了 ![file](https://hueifeng.com/uploads/img-f80ebee8-c45d-4481-9f9d-3bfe790b2a0c.png) ## 新增約定 自定義約定要在Startup中的void ConfigureServices(IServiceCollection services)方法下中的 services.AddRazorPages()方法下追加RazorPagesOptions方法並新增約定的集合: ```csharp public void ConfigureServices(IServiceCollection services) { ... services.AddRazorPages().AddRazorPagesOptions(options => { //options.Conventions.AddPageRoute("/Index", "Index.html"); options.Conventions.Add(new HtmlExtensionPageRouteModelConvention(_loggerFactory.CreateLogger())); }); } ``` 通過如上程式碼,我們便在.NET中實現了偽靜態,對URL路由匹配規則的附加操作. https://github.com/hueifeng/BlogSample/tree/master/src/PageRouteModelConventionURL