由于我是ASP.NET Core中的Razor Pages概念的新手,我想应用一般URL来将culture参数传递给路径
我已经使用MVC完成了这项工作,但我也希望将其应用于Razor页面 这是我在MVC中所做的以及它根据需要工作
routes.MapRoute(
name: "default",
template: "{culture}/{controller=Home}/{action=Index}/{id?}");
我已将其应用于特定页面及其工作
options.Conventions.AddPageRoute("/RealEstate/Index", "{culture}/RealEstate");
但是,当我想申请所有页面时,它不起作用,而且我不知道应该作为PageName传递什么
options.Conventions.AddPageRoute("*", "{culture}/{*url}");
我也希望将此约定中的admin文件夹排除为siteName.com/admin而不是en-US / Admin我还需要在用户首次打开网站时在URL中设置默认文化,例如例如,作为siteName.com并加载默认文化,甚至默认加载siteName.com/en-US
感谢。
答案 0 :(得分:3)
您可以使用AddFolderRouteModelConvention
将路径模型约定应用于文件夹。文档中有example如何执行此操作,我已根据您的目的对其进行了修改:
options.Conventions.AddFolderRouteModelConvention("/", model =>
{
foreach (var selector in model.Selectors)
{
selector.AttributeRouteModel = new AttributeRouteModel
{
Order = -1,
Template = AttributeRouteModel.CombineTemplates(
"{culture}",
selector.AttributeRouteModel.Template),
};
}
});
这会将约定应用于所有页面,因为"/"
被设置为文件夹,因此适用于根级别。这不是像我链接的示例中那样添加新选择器,而是修改现有选择器以预先添加{culture}
令牌,您可以在页面中按名称访问该令牌,例如:
public void OnGet(string culture)
{
// ...
}
如果我们添加了一个新选择器,那么无论是否有文化都可以访问这些页面,使其成为可选项。根据我所显示的方法,需要{culture}
令牌,如OP中所示。
答案 1 :(得分:1)
感谢Kirk Larkin的帮助
我用他的答案,并做了一些小的修改,将Admin从文化路由中排除,并且在未选择文化的情况下为网站设置默认文化
options.Conventions.AddFolderRouteModelConvention("/", model =>
{
foreach (var selector in model.Selectors)
{
if (selector.AttributeRouteModel.Template.StartsWith("Admin"))
{
selector.AttributeRouteModel = new AttributeRouteModel
{
Order = -1,
Template =
selector.AttributeRouteModel.Template,
};
}
else
{
selector.AttributeRouteModel = new AttributeRouteModel
{
Order = -1,
Template = AttributeRouteModel.CombineTemplates(
"{culture=en-US}",
selector.AttributeRouteModel.Template),
};
}
}
});