.NET探索模型路由约定实现伪静态

概述

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

file

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

file

添加约定

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

相关文章
相关标签/搜索