2021-02-19

.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上面,在下面可以显示出来为我们生成的路径,这个路由则是根据我们设置的规则而生成出来的.

file

当我们在Selectors.Add方法内中的new AttributeRouteModel对象中将SuppressLinkGeneration设置为true,这样的话我们是将路由规则设置禁止了,看下图可以看出,
当我们把所有的规则都设置为禁止生成后,我们当鼠标剪头再次放到Home上面时已经不会为我们再生成新的链接了

file

添加约定

自定义约定要在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









原文转载:http://www.shaoqun.com/a/569574.html

跨境电商:https://www.ikjzd.com/

c2c:https://www.ikjzd.com/w/1576

custommade:https://www.ikjzd.com/w/2514


概述IPageRouteModelConvention接口用于自定义PageRouteModel,这个对象在Microsoft.AspNetCore.Mvc.ApplicationModels命名空间中,代表着RazorPage路由设置,换句话说我们可以通过实现该接口覆盖默认的实现。该接口需要实现一个成员voidApply(PageRouteModelmodel)。通过这个方法,我们可以访问有关当
易佰:https://www.ikjzd.com/w/1482
环球易购:https://www.ikjzd.com/w/1034
kkr:https://www.ikjzd.com/w/1340
易启电商学院:https://www.ikjzd.com/w/1792
运营干货!亚马逊移除差评的六种办法:https://www.ikjzd.com/home/16228
受新冠肺炎影响,洛杉矶港二月份集装箱货量预计将下降25%:https://www.ikjzd.com/home/117035

No comments:

Post a Comment