代码之家  ›  专栏  ›  技术社区  ›  Robert Corvus

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

  •  7
  • Robert Corvus  · 技术社区  · 8 年前

    我正在使用ASP构建一个系统。NET Core 2.0 Razor页面(不是MVC),为页面添加多条路由时遇到问题。例如,abc应该能够访问所有页面。com/语言/ 段 /商店/mypage或abc。com/language/shop/mypage,其中两个路径都指向同一个页面。段路径部分是可选的,然后页面使用可选的段信息进行填充。

    CombineTemplates标记中的问号语法似乎不起作用,它似乎只在路径的最后一部分起作用。浏览到{段?}中没有值的url第404节。例如:

    AttributeRouteModel.CombineTemplates("{language}/{segment?}/shop", selector.AttributeRouteModel.Template);
    

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

    options.Conventions.Add(new DefaultPageRouteModelConvention());
    options.Conventions.Add(new SegmentPageRouteModelConvention());
    

    在ASP中。NET MVC中,我可以添加两条指向同一区域/控制器/操作的不同路由,并使用两个不同的名称MapRouteWithName。 有什么办法吗。NET Razor页面语法?

    1 回复  |  直到 7 年前
        1
  •  8
  •   Robert Corvus    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;
            }
        }