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

Ahm*_*ano 3 c# asp.net-mvc 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?}");
Run Code Online (Sandbox Code Playgroud)

我已经将它应用于特定的 Page 并且它也能正常工作

   options.Conventions.AddPageRoute("/RealEstate/Index", "{culture}/RealEstate");
Run Code Online (Sandbox Code Playgroud)

但是当我想申请所有页面时它不起作用,我不知道应该作为 PageName 传递什么

 options.Conventions.AddPageRoute("*", "{culture}/{*url}");
Run Code Online (Sandbox Code Playgroud)

我还想从这个约定中排除 admin 文件夹是 siteName.com/admin 而不是 en-US/Admin 我还需要在用户第一次打开网站时在 URL 中设置默认文化,例如是 siteName.com 并加载默认文化,甚至默认加载 siteName.com/en-US

谢谢。

Kir*_*kin 7

您可以使用 将路线模型约定应用于文件夹AddFolderRouteModelConvention。文档有一个如何执行此操作的示例,我已根据您的目的对其进行了修改:

options.Conventions.AddFolderRouteModelConvention("/", model =>
{
    foreach (var selector in model.Selectors)
    {
        selector.AttributeRouteModel = new AttributeRouteModel
        {
            Order = -1,
            Template = AttributeRouteModel.CombineTemplates(
                "{culture}",
                selector.AttributeRouteModel.Template),
        };
    }
});
Run Code Online (Sandbox Code Playgroud)

这将约定应用于所有页面,因为它"/"被设置为文件夹,因此适用于根级别。与我链接的示例中的添加新选择器不同,这会修改现有选择器以添加{culture}令牌,您可以在页面中按名称访问该令牌,例如:

public void OnGet(string culture)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果我们添加了一个新的选择器,无论有没有文化,页面都可以访问,使其成为可选的。使用我展示的方法,{culture}需要令牌,如 OP 中所示。