ASP.NET Core Razor页面多路径路由

7
我正在使用ASP.NET Core 2.0 Razor Pages(非MVC)构建系统,添加多个页面路由时遇到了困难。例如,所有页面都应该能够通过abc.com/language/segment/shop/mypage或abc.com/language/shop/mypage访问,其中这两个路径指向同一页面。可选的段路径部分是可选的,然后页面会处理可选的段信息。
在CombineTemplates标记中的问号语法似乎无效,它似乎只在路径的最后一节中有效。在没有{segment?}部分值的URL上进行浏览导致404错误。例如:
AttributeRouteModel.CombineTemplates("{language}/{segment?}/shop", selector.AttributeRouteModel.Template);

我尝试了下面这样的代码,但它只是将两个路径连接在一起,我需要能够同时启用它们。
options.Conventions.Add(new DefaultPageRouteModelConvention());
options.Conventions.Add(new SegmentPageRouteModelConvention());

在ASP.NET Razor页面中,我可以使用两个不同命名的MapRouteWithName指向同一个区域/控制器/操作来添加两个不同的路由。 有什么想法如何使用.NET Razor Page语法实现这个功能呢?
1个回答

8

这段代码有效:

只添加一个约定(不是两个不同的约定):

options.Conventions.Add(new CombinedPageRouteModelConvention());

在新的规则中,添加两个路由选择器:
private class CombinedPageRouteModelConvention : IPageRouteModelConvention
    {
        private const string BaseUrlTemplateWithoutSegment = "{language}/shop";
        private const string BaseUrlTemplateWithSegment = "{language}/{segment}/shop";
        public void Apply(PageRouteModel model)
        {
            var allSelectors = new List<SelectorModel>();
            foreach (var selector in model.Selectors)
            {
                //setup the route with segment
                allSelectors.Add(CreateSelector(selector, BaseUrlTemplateWithSegment));

                //setup the route without segment
                allSelectors.Add(CreateSelector(selector, BaseUrlTemplateWithoutSegment));
            }

            //replace the default selectors with new selectors
            model.Selectors.Clear();
            foreach (var selector in allSelectors)
            {
                model.Selectors.Add(selector);
            }
        }

        private static SelectorModel CreateSelector(SelectorModel defaultSelector, string template)
        {
            var fullTemplate = AttributeRouteModel.CombineTemplates(template, defaultSelector.AttributeRouteModel.Template);
            var newSelector = new SelectorModel(defaultSelector)
            {
                AttributeRouteModel =
                {
                    Template = fullTemplate
                }
            };
            return newSelector;
        }
    }

你能贴一些资源链接吗? - PussInBoots
这里有一个文档链接另一个教程链接 - christian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接