【问题标题】:Routed localization in identity pages in ASP.NET MVC CoreASP.NET MVC Core 中身份页面中的路由本地化
【发布时间】:2019-06-13 03:15:22
【问题描述】:

我目前正在 ASP.NET MVC Core 中开发一个 Web 应用程序,用户应该在其中注册。这是一个本地化的 Web 应用程序,应该能够运行多种语言。为了对 SEO 友好,我选择了路由本地化,所以我的 url 看起来像: https://localhost:5001/en/Cataloguehttps://localhost:5001/fr/catalogue

为此,我在 Startup.cs 的 ConfigureServices 方法中添加了这段代码

services.AddLocalization(options => options.ResourcesPath = "Resources");

        services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
            .AddViewLocalization()
            .AddDataAnnotationsLocalization();

在我的配置方法中我添加了这个:

IList<CultureInfo> supportedCultures = new List<CultureInfo>
{
    new CultureInfo("en"),
    new CultureInfo("fr"),
};
var localizationOptions = new RequestLocalizationOptions
{
    DefaultRequestCulture = new RequestCulture("en"),
    SupportedCultures = supportedCultures,
    SupportedUICultures = supportedCultures
};
var requestProvider = new RouteDataRequestCultureProvider();
localizationOptions.RequestCultureProviders.Insert(0, requestProvider);

app.UseRouter(routes =>
{
    routes.MapMiddlewareRoute("{culture=en}/{*mvcRoute}", subApp =>
    {
        subApp.UseRequestLocalization(localizationOptions);

        subApp.UseMvc(mvcRoutes =>
        {
            mvcRoutes.MapRoute(
                name: "areaRoute",
                template: "{culture=en}/{area:exists}/{controller=Home}/{action=Index}/{id?}");

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

这就像一个魅力。我可以将我的 MVC 页面翻译成任何我想要的风格。我的问题是身份页面。我将这些页面添加为脚手架项目。他们的 URL 指向https://localhost:5001/Identity/Account/Register。尝试使用https://localhost:44339/en/Identity/Account/Register 访问它们不起作用。如何使用身份页面实现路由本地化?

【问题讨论】:

  • 这可能是一个愚蠢的问题,但你不能使用属性路由来手动设置一些问题页面路由吗? blogs.msdn.microsoft.com/webdev/2013/10/17/…
  • 嗨,Iskander,我可以为我的观点做到这一点——正如你从原始问题所附的代码中看到的那样,我这样做了——但我不能为身份剃须刀页面做到这一点。无论如何,我不喜欢微软将 Razor 页面用于那些身份支架项目。

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


【解决方案1】:

AddAreaFolderRouteModelConvention 会变魔术:

services.AddMvc()
    .AddRazorPagesOptions(options =>
    {
        options.Conventions.AddAreaFolderRouteModelConvention("Identity", "/Account/", model =>
         {
             model.Selectors.ForEach(x =>
             {
                 if (x.AttributeRouteModel.Template.StartsWith("Identity"))
                 {
                     x.AttributeRouteModel = new AttributeRouteModel()
                     {
                         Order = -1,
                         Template = AttributeRouteModel.CombineTemplates(("{culture=en-US}"),
                             x.AttributeRouteModel.Template)
                     };
                 }
             });


         });
    });

MSDN 页面说:

pageName String 页面名称,例如/用户/列表

页面名称是不带扩展名的文件的路径,相对于 指定区域的页面根目录。例如页面名称 对于文件 Areas/Identity/Pages/Manage/Accounts.cshtml,是 /管理/帐户。

所以所有页面实际上都在“/Account/”内,这里是一些生成的链接:

/en-us/identity/account/login
/en-us/identity/account/manage/index
/en-us/identity/account/manage/orders

如果你不喜欢路径中的“/identity/”,你可以这样做:

AttributeRouteModel.CombineTemplates(("{culture=en-US}"), 
  x.AttributeRouteModel.Template.Substring("Identity/".Length)) //<==Substring

那么所有的链接都是:

/en-us/account/login
/en-us/account/manage/index
/en-us/account/manage/orders

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 2020-02-23
    • 2019-06-09
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 2014-05-14
    相关资源
    最近更新 更多