13

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

 3 years ago
source link: http://www.cnblogs.com/yyfh/p/14417639.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

概述

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

QnUFfiZ.png!mobile

当我们在Selectors.Add方法内中的 new AttributeRouteModel 对象中将 SuppressLinkGeneration 设置为true,这样的话我们是将路由规则设置禁止了,看下图可以看出,

当我们把所有的规则都设置为禁止生成后,我们当鼠标剪头再次放到Home上面时已经不会为我们再生成新的链接了

iAbeUnM.png!mobile

添加约定

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK