ASP.NET Core Razor Page多路径路由

Rob*_*vus 6 c# asp.net-core-2.0 razor-pages

我正在使用ASP.NET Core 2.0 Razor Pages(而不是MVC)构建一个系统,我在为页面添加多个路由时遇到了问题.例如,所有的网页应该能够通过abc.com/language/达成 /店/我的空间或abc.com/language/shop/mypage,其中两个路径指向同一个页面.段路径部分是可选的,然后页面填充可选的段信息.

CombineTemplates标记中的问号语法似乎不起作用,它似乎只在路径的最后一部分中起作用.浏览到{segment?}部分中没有值的网址会导致404.例如:

AttributeRouteModel.CombineTemplates("{language}/{segment?}/shop", selector.AttributeRouteModel.Template);
Run Code Online (Sandbox Code Playgroud)

我尝试了下面这样的代码,但它只是将两条路径相互追加,我需要能够使它们都有效.

options.Conventions.Add(new DefaultPageRouteModelConvention());
options.Conventions.Add(new SegmentPageRouteModelConvention());
Run Code Online (Sandbox Code Playgroud)

在ASP.NET MVC中,我可以添加两个指向同一区域/控制器/操作的不同路由,其中​​有两个不同的名为MapRouteWithName.有任何想法如何使用.NET Razor Page语法执行此操作?

Rob*_*vus 7

此代码有效:

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

options.Conventions.Add(new CombinedPageRouteModelConvention());
Run Code Online (Sandbox Code Playgroud)

在新约定中,添加两个路由选择器:

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;
        }
    }
Run Code Online (Sandbox Code Playgroud)