ASP.NET 核心 Razor 页面多路径路由
ASP.NET Core Razor Page multiple path routing
我正在使用 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 中,我可以添加两个指向同一个 area/controller/action 且具有两个不同名称的 MapRouteWithName 的不同路由。
关于如何使用 .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;
}
}
我正在使用 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 中,我可以添加两个指向同一个 area/controller/action 且具有两个不同名称的 MapRouteWithName 的不同路由。 关于如何使用 .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;
}
}