【问题标题】:Changing default route in ASP.NET Core Razor Pages更改 ASP.NET Core Razor 页面中的默认路由
【发布时间】:2018-11-14 20:44:43
【问题描述】:

由于我是 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");

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

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

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

谢谢。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core razor-pages


    【解决方案1】:

    您可以使用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)
    {
        // ...
    }
    

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

    【讨论】:

      【解决方案2】:

      感谢柯克·拉金的帮助

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

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

      【讨论】:

      • 您是如何修复默认语言的?此行 Template = AttributeRouteModel.CombineTemplates( "{culture=en-US}" 不适合我。
      猜你喜欢
      • 2019-10-13
      • 2019-05-22
      • 2020-05-06
      • 2023-03-09
      • 2020-03-23
      • 2021-12-16
      • 2021-10-02
      • 2020-05-06
      • 1970-01-01
      相关资源
      最近更新 更多