如何进行ASP.NET Core 3.1路由(Route,ActionName)本地化



我正在开发一个ASP.NET Core 3.1 MVC网站,该网站使用域名来确定本地化的区域性。

例如,所有去往域example.com的请求都将具有en-US区域性,而所有去往域名example.org的请求都具有de-DE区域性。

我修改了以前未本地化的网站,在视图等中使用本地化。我使用了自己的RequestCultureProvider实现来基于域名设置区域性。结果如下:

  • https://example.com/Products/My-Application/Help使用en-US作为文化并且具有英文文本
  • https://example.org/Products/My-Application/Help使用de-DE作为文化,并具有德语文本

注意:Products是控制器,My-Application是应用程序的名称(数据库中的URL段(,HelpProducts控制器中的操作。URL结构是我为我的网站使用的实际结构

然而,我还想在实际源代码(控制器类和操作函数(中依赖仅英文名称的情况下翻译URL

例如,这里有一个具有单个操作的伪控制器(由于简化,与上面的示例URL断开(。

[Controller]
[Route("/Products")]
public class ProductController : Controller
{
[ActionName("EnglishName")]
public IActionResult EnglishName()
{
return View();
}
}

对于这个简化的例子:

  • URL示例:
    • 英文URL:https://example.com/Products/EnglishName
    • 德语URL:https://example.org/Produkte/GermanName
  • 在源代码中(为了清楚起见(,控制器的Route的值不应更改
  • 在源代码中(为了清楚起见(,EnglishName动作函数的ActionName的值不应更改
  • 在源代码中(为了清楚起见(,动作EnglishName的函数名称不应更改
  • 在路由上下文中,Route的值在de-DE区域性中应为">/Produkte">
  • 在路由上下文中,EnglishName操作的ActionName的值在de-DE区域性中应为">GermanName">
  • 所有本地化都应使用"常用方式"(.resx文件,如视图的库存本地化等(

如果不手动构建动态路由表,如何实现这一点

目前,我没有起点。例如,ASP.NET Core路由本地化的搜索结果只会给出URL中具有区域性的答案(域名除外(,但这不是我的用例。我尝试为属性使用变量名,但这当然不起作用。

Filip Woj在他的博客文章中指出了一个解决方案。

他展示了MapDynamicControllerRouteDynamicRouteValueTransformer类结合用于翻译路由的用法。

最新更新