ASP.NET(MVC)路由国际化

ASP.NET(MVC)路由国际化,asp.net,asp.net-mvc,internationalization,routing,Asp.net,Asp.net Mvc,Internationalization,Routing,我在ASP.NET MVC网站上寻找路线国际化/本地化的解决方案。我偶然发现了Maarten Balliauw的博客文章。他提出了一个非常好的解决方案,效果非常好,直到视图中出现Html.RenderAction(“…”) 基本上,他引入了一个继承自System.Web.Routing.Route的TranslatedRoute,而不是使用字典进行即时翻译 你知道为什么调用Html.RenderAction(“…”)时这种行为会有所不同吗?此外,如果只发生错误,如果应该呈现的操作在同一个控制器中

我在ASP.NET MVC网站上寻找路线国际化/本地化的解决方案。我偶然发现了Maarten Balliauw的博客文章。他提出了一个非常好的解决方案,效果非常好,直到视图中出现
Html.RenderAction(“…”)

基本上,他引入了一个继承自
System.Web.Routing.Route
TranslatedRoute
,而不是使用字典进行即时翻译

你知道为什么调用
Html.RenderAction(“…”)
时这种行为会有所不同吗?此外,如果只发生错误,如果应该呈现的操作在同一个控制器中,则会出现这种情况

下面是确切的错误:

“路径'/MyTranslatedControllerName'的控制器未找到或未实现IController。”

更新:

以下是我的路由配置(取自Maarten的示例项目,添加了联系人的路由,这是要呈现的部分):

publicstaticvoidregisterOutes(路由收集路由)
{
CultureInfo cultureEN=CultureInfo.GetCultureInfo(“en-US”);
CultureInfo cultureDE=CultureInfo.GetCultureInfo(“de”);
CultureInfo cultureFR=CultureInfo.GetCultureInfo(“fr-fr”);
DictionaryRouteValueTranslationProvider translationProvider=新DictionaryRouteValueTranslationProvider(
新名单{
新RouteValueTranslation(cultureEN,“家”,“家”),
新RouteValueTranslation(cultureEN,“About”,“About”),
新RouteValueTranslation(cultureEN,“联系人”,“联系人”),
新RouteValueTranslation(cultureDE,“家”、“家”),
新RouteValueTranslation(cultureDE,“关于”,“关于”),
新的RouteValueTranslation(cultureDE,“联系人”、“Kontakt”),
新的RouteValueTranslation(cultureFR、“Home”、“Demarer”),
新RouteValueTranslation(cultureFR,“关于”,“信息”),
新RouteValueTranslation(cultureFR,“联系人”、“联系人”)
}
);
routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);
routes.MapTranslatedRoute(
“TranslatedRoute”,
“{controller}/{action}/{id}”,
新建{controller=“Home”,action=“Index”,id=”“},
新建{controller=translationProvider,action=translationProvider},
真的
);
routes.MapRoute(
“默认值”,//路由名称
“{controller}/{action}/{id}”,//带参数的URL
新的{controller=“Home”,action=“Index”,id=”“}//参数默认值
);

这取决于您的路线配置。您可以共享它吗

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

有一种检测方法:routeData.DataTokens[“ParentActionViewContext”] 问题是TranslatedRoute知道这一点的时间太晚了

简而言之:我对System.Web.Mvc中ChildActionExtensions.ActionHelper的当前实现感到震惊,这是不可能的

我确实有一个(肮脏的、不尊重自己的)解决方法(您也可以将其包装在自定义RenderAction()方法中): -在您看来,请执行以下操作:

<%
RouteData.DataTokens.Add("GoingToRenderChildAction",
true); %> <%
Html.RenderAction("Contact", "Home");
%> <%
RouteData.DataTokens["GoingToRenderChildAction"]
= false; %>
在TranslatedRoute.cs
GetVirtualPath
中,添加以下内容作为第一条语句:

if(requestContext.RouteData.DataTokens.ContainsKey("GoingToRenderChildAction") &&
(bool)requestContext.RouteData.DataTokens["GoingToRenderChildAction"] == true)
{
    return base.GetVirtualPath(requestContext, values);
}
if (values.ContainsKey("childAction") &&
   (bool)values["childAction"] == true)
{
  return base.GetVirtualPath(requestContext, values);
}
这会起作用,但可能有不必要的副作用。

在您的视图中(Razor语法,VB):

然后在TranslatedRoute.cs GetVirtualPath中作为第一条语句:

if(requestContext.RouteData.DataTokens.ContainsKey("GoingToRenderChildAction") &&
(bool)requestContext.RouteData.DataTokens["GoingToRenderChildAction"] == true)
{
    return base.GetVirtualPath(requestContext, values);
}
if (values.ContainsKey("childAction") &&
   (bool)values["childAction"] == true)
{
  return base.GetVirtualPath(requestContext, values);
}

这种方法更轻,而且只适用于所需的操作。

我刚刚使用了您的示例项目,在
HomeController
中添加了一个联系人操作,然后在
About.aspx
上执行了
Html.RenderAction(“联系人”)
。还添加了新的
新的RouteValueTranslation(cultureEN,“联系人”,“联系人”)
(对于其他文化也是如此)谢谢!所以我会考虑用这个解决方案弄乱我的代码;-)太糟糕了,你的路线本地化方法是我找到的最干净的解决方案…@maartenba:很好的解决方案。我刚刚用相应的Razor语法更新了你的答案。我还在使用你的MVC站点地图提供商:你在这些实现方面帮了很多忙…谢谢!你可以试试我刚找到的很棒的项目!你可以完成它 .
if (values.ContainsKey("childAction") &&
   (bool)values["childAction"] == true)
{
  return base.GetVirtualPath(requestContext, values);
}