替换 ASP.NET Core 中现有的操作路由

问题描述 投票:0回答:1

我的 ASP.NET Core 8 项目引用包含以下控制器的外部项目:

public class AccountController
{
    [HttpGet]
    [AllowAnonymous]
    public async Task<IActionResult> Login(string returnUrl = null)
    {
        // ...
    }

    [HttpGet]
    [AllowAnonymous]
    public async Task<IActionResult> ChangePassword(string returnUrl = null)
    {
        // ...
    }
}

地点:

  • AccountController.Login
    映射到路线
    /Login
  • AccountController.ChangePassword
    映射到路线
    /ChangePassword

我想在我的 ASP.NET Core 8 项目的

Startup.cs
中替换这些路由,以便路由支持多种文化,如下所示:

AccountController.Login -> /en/login, /it/login

AccountController.ChangePassword -> /en/change-password, /it/cambia-password

有人可以提供有关如何在

Startup.cs
文件中进行配置的指导或示例吗?

c# asp.net-core .net-core
1个回答
0
投票

要通过更改路由来支持多种文化,您可以阅读此文档:应用 RouteDataRequest CultureProvider

以下是示例演示:

在asp.net core mvc测试项目中:

1.先创建资源文件,参考资源文件

资源文件的名称必须与视图页面匹配(我的测试视图:Views\Home\Index.cshtml)

resource file

2.在程序.cs中配置:

builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");

builder.Services.AddMvc()
    .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
    .AddDataAnnotationsLocalization();


builder.Services.Configure<RequestLocalizationOptions>(options =>
{
    var supportedCultures = new List<CultureInfo>
                {
                    new CultureInfo("en"),
                    new CultureInfo("it")
                    // Add more cultures as needed
                };

    options.DefaultRequestCulture = new RequestCulture("it");
    options.SupportedCultures = supportedCultures;
    options.SupportedUICultures = supportedCultures;

    options.RequestCultureProviders = new List<IRequestCultureProvider>
                {
                    new RouteDataRequestCultureProvider()
                    {
                        RouteDataStringKey = "culture",
                        Options = options // This line ensures options.DefaultRequestCulture is used
                    }
                };
});


app.UseRequestLocalization();

app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "localized-login",
        pattern: "{culture}/{action=Index}",
        defaults: new { controller = "Home", action = "Index" }, // In your code, you should change to `controller = "Account" `
        constraints: new { culture = new RegexRouteConstraint(@"^[a-zA-Z]{2}(-[a-zA-Z]{2})?$") }
    );

    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
});

在外部项目中:

3.在控制器中注入

IStringLocalizer

private readonly IStringLocalizer<HomeController> _localizer;

public HomeController(IStringLocalizer<HomeController> localizer)
{
    _localizer = localizer;
}

public IActionResult Login()
{

    ViewData["Title"] = _localizer["LoginPageTitle"];
    ViewData["ButtonText"] = _localizer["LoginButtonText"];

    return View();
}

4.在登录视图页面中插入

IViewLocalizer

@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer

<h1>@Localizer["LoginPageTitle"]</h1>
<button>@Localizer["LoginButtonText"]</button>

测试结果:

it culture test

en culture test

© www.soinside.com 2019 - 2024. All rights reserved.