ASP.NET Core 3.1 路由(Route、ActionName)本地化怎么做?

Posted

技术标签:

【中文标题】ASP.NET Core 3.1 路由(Route、ActionName)本地化怎么做?【英文标题】:How to do ASP.NET Core 3.1 routing (Route, ActionName) localization? 【发布时间】:2020-04-30 10:16:58 【问题描述】:

我正在开发一个使用域名来确定本地化文化的 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 slug),HelpProducts 控制器中的操作。 URL 结构是我用于网站的实际结构。

但是,我还想翻译 URL,同时在实际源代码(控制器类和操作函数)中仅依赖英文名称。

例如,这是一个具有单个操作的虚拟控制器(由于简化,与上面的示例 URL 不同)。

[Controller]
[Route("/Products")]
public class ProductController : Controller

    [ActionName("EnglishName")]
    public IActionResult EnglishName()
    
        return View();
    

对于这个简化的例子:

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

如何在不手动构建动态路由表的情况下实现这一点?

目前,我没有起点。例如的搜索结果ASP.NET Core 路由本地化 只是提出了在 URL 中包含文化的答案(域名除外),但这不是我的用例。我尝试为属性使用变量名,但这当然行不通。

【问题讨论】:

【参考方案1】:

Filip Woj 在他的blog post 中指出了一个解决方案。

他展示了MapDynamicControllerRoute 结合DynamicRouteValueTransformer 类的用法来翻译路由。

【讨论】:

以上是关于ASP.NET Core 3.1 路由(Route、ActionName)本地化怎么做?的主要内容,如果未能解决你的问题,请参考以下文章

在单个 ASP.NET Core 3.1 Web API 中管理两个 SPA;一个在根目录中,另一个在“管理员”路由中

如何更改 .NET Core 3.1 API 中的路由错误

ASP.NET Core 属性路由 - 区域设置前缀

Asp.net core 3.1 中的路由

ASP.NET Core 3.1 Razor 页面路由不明确匹配异常

ASP.net core 3.1 中控制器和剃须刀页面之间的路由