我正在将 .Net 4.7 应用程序转换为 .Net Core 3.1。我正在更新本地化部分。我遵循了一些示例,例如localization-in-asp-net-core-3-1-mvc。
它工作正常,但我没有找到一种方法让 UrlHelper.Action 在没有精确文化的情况下工作。我想自动设置文化参数。它应该来自用户声明、以前的请求文化或默认文化。
例如,如果 URL 是“/Home/Contact”,则 UrlHelper 或 HtmlHelper 生成的链接将是 /Home/About。如果当前 URL 为“/en/Home/Contact”,则链接将生成为“/en/Home/About”。如果用户通过身份验证,则应该是“/userCulture/Home/About”。
但我不能只强制我的路由模板 "{culture=en}/{controller=Home}/{action=Welcome}/{id?}" 因为根 url 必须可访问并且 API url 应该保持 "api/somestufff" .
启动.cs:
var supportedCultures = CultureHelper.Cultures.Select(a => new CultureInfo(a)).ToArray();
var requestLocalizationOptions = new RequestLocalizationOptions();
requestLocalizationOptions.SupportedCultures = supportedCultures;
services.AddLocalization();
services.Configure<RequestLocalizationOptions>(options =>
{
options.DefaultRequestCulture = new RequestCulture("fr", "fr");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.RequestCultureProviders.Insert(0, new RouteValueRequestCultureProvider() { Options = requestLocalizationOptions });
});
//......................................
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(name: "culture-route", pattern: "{culture=en}/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
});
控制器 :
[Route("api/somestufff")]
public async Task<IActionResult> Somestufff()
{ ... }
[Route("{culture:length(2)}/items/{number:int}/{permalink?}")]
public async Task<IActionResult> DisplayItem(int number, string permalink)
{ ... }
剃刀页面:
Url.Action("DisplayItem", "MyController",new { culture = ViewBag.Culture as string, number = 123, permalink = "permalink1235" })
// => /en/items/123/permalink1235 OK
Url.Action("DisplayItem", "MyController",new { number = 123, permalink = "permalink1235" })
// => /en/MyController/DisplayItem?number=123&permalink=permalink1235 KO
如果缺少,有没有办法让 Urlhelper 从当前上下文中添加文化?