更改 ASP.NET 核心 Razor 页面中的默认路由

Changing default route in ASP.NET Core Razor Pages

因为我是 ASP.NET Core 中的 Razor Pages 概念的新手,我想应用一个通用的 URL 来将文化参数传递给路由

我已经使用 MVC 完成了该操作,但我还想将其应用于 Razor 页面 这是我在 MVC 中所做的及其根据需要工作

  routes.MapRoute(
                    name: "default",
                    template: "{culture}/{controller=Home}/{action=Index}/{id?}");

我已经将它应用到特定页面并且它也能正常工作

   options.Conventions.AddPageRoute("/RealEstate/Index", "{culture}/RealEstate");

但是当我想申请所有页面时它不起作用而且我不知道应该将什么作为页面名称传递

 options.Conventions.AddPageRoute("*", "{culture}/{*url}");

我还想将 admin 文件夹从该约定中排除为 siteName。com/admin 而不是 en-US/Admin 我还需要在 URL 中设置默认区域性,当用户第一次打开站点,例如 siteName.com 并加载默认文化,甚至加载 siteName.com/en-US 默认

谢谢。

您可以使用 AddFolderRouteModelConvention. The docs have an 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 中所示。

感谢 Kirk Larkin 的帮助

我使用了他的答案,并添加了一个小修改以将管理员从文化路由中排除,同时在未选择文化时为网站设置默认文化

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

                       }
                   });