在ASP.NET Core Razor Pages中更改默认路由

时间:2018-06-05 11:19:41

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

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

感谢。

2 个答案:

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

                       }
                   });