c# - ASP.NET Core Razor Page 多路径路由

标签 c# asp.net-core-2.0 razor-pages

我正在使用 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 MVC 中,我可以使用两个不同的名称 MapRouteWithName 添加两个指向相同区域/ Controller /操作的不同路由。 关于如何使用 .NET Razor 页面语法执行此操作的任何想法?

最佳答案

此代码有效:

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

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;
        }
    }

关于c# - ASP.NET Core Razor Page 多路径路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48710826/

相关文章:

c# - VS2017 .Net Core 2.0 测试 : "Failed to initialize client proxy: could not connect to test process"

asp.net-core - 如何将列表从一个页面传递到另一页面。

asp.net-core - ASP 核心 : how to route to API Controller that is located in the area folder?

c# - 隐藏一个组框并删除它在 winform 中存在的空间

c# - Elmah 自定义记录器不工作

c# - 我应该如何在 Vector3 结构中实现 .Equals() ?

asp.net-core - 使用 Razor 页面的 Ajax 发布

C# 向 .net 枚举添加额外值

mysql - 在 EntityFrameworkCore 中加载相关数据时出错

c# - 聊天机器人可以在本地机器人框架模拟器中正常工作,但不能在天蓝色聊天机器人中工作