gpt4 book ai didi

ASP.NET (MVC) 路由国际化

转载 作者:行者123 更新时间:2023-12-04 15:26:36 25 4
gpt4 key购买 nike

我正在寻找一种解决方案来国际化/本地化 ASP.NET MVC 网站上的路由。我偶然发现了博文 Translating routes (ASP.NET MVC and Webforms)马丁·巴利奥 (Maarten Balliauw)。他提出了一个非常好的解决方案,效果很好 - 直到出现 Html.RenderAction("...")在 View 中。

基本上他介绍了一个 TranslatedRoute继承自 System.Web.Routing.Route ,这比使用带有动态翻译的字典进行翻译。

知道为什么在调用 Html.RenderAction("...") 时会有不同的表现?此外,如果错误只发生,如果应该呈现的 Action 在同一个 Controller 中。

这是确切的错误:

"The controller for path '/MyTranslatedControllerName' was not found or does not implement IController."



更新:

这是我的路由配置(取自 Maarten 的示例项目,为 Contact 添加了路由,这是要渲染的部分):
    public static void RegisterRoutes(RouteCollection routes)
{
CultureInfo cultureEN = CultureInfo.GetCultureInfo("en-US");
CultureInfo cultureDE = CultureInfo.GetCultureInfo("de-DE");
CultureInfo cultureFR = CultureInfo.GetCultureInfo("fr-FR");

DictionaryRouteValueTranslationProvider translationProvider = new DictionaryRouteValueTranslationProvider(
new List<RouteValueTranslation> {
new RouteValueTranslation(cultureEN, "Home", "Home"),
new RouteValueTranslation(cultureEN, "About", "About"),
new RouteValueTranslation(cultureEN, "Contact", "Contact"),
new RouteValueTranslation(cultureDE, "Home", "Home"),
new RouteValueTranslation(cultureDE, "About", "About"),
new RouteValueTranslation(cultureDE, "Contact", "Kontakt"),
new RouteValueTranslation(cultureFR, "Home", "Demarrer"),
new RouteValueTranslation(cultureFR, "About", "Infos"),
new RouteValueTranslation(cultureFR, "Contact", "Contact")
}
);

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapTranslatedRoute(
"TranslatedRoute",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" },
new { controller = translationProvider, action = translationProvider },
true
);

routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);

最佳答案

这将取决于您的路由配置。你能分享一下吗?

编辑: RenderAction 方法似乎在路由上使用“GetVirtualPath”来确定 MvcHandler 的 URL。但是,该方法不会回调“GetRouteData”方法。

有一种检测方法: routeData.DataTokens["ParentActionViewContext"]
问题是 TranslatedRoute 在管道中迟到了才知道这件事......

简而言之:我担心 System.Web.Mvc 中 ChildActionExtensions.ActionHelper 的当前实现是不可能的......

我确实有一个(肮脏的,不尊重自己的)解决方法(您也可以将其包装在自定义的 RenderAction() 方法中):
- 在你看来,这样做:

<%
RouteData.DataTokens.Add("GoingToRenderChildAction",
true); %> <%
Html.RenderAction("Contact", "Home");
%> <%
RouteData.DataTokens["GoingToRenderChildAction"]
= false; %>

Razor 语法:
@{
ViewContext.RequestContext.RouteData.DataTokens.Add("GoingToRenderChildAction",
true);
}

@Html.Action("Action", "Controller" )

@{
ViewContext.RequestContext.RouteData.DataTokens["GoingToRenderChildAction"]=false;
}

在 TranslatedRoute.cs GetVirtualPath , 添加以下内容作为第一条语句:
if(requestContext.RouteData.DataTokens.ContainsKey("GoingToRenderChildAction") &&
(bool)requestContext.RouteData.DataTokens["GoingToRenderChildAction"] == true)
{
return base.GetVirtualPath(requestContext, values);
}

这会起作用,但可能会产生不必要的副作用。

关于ASP.NET (MVC) 路由国际化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6221561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com