dav*_*ser 6 asp.net asp.net-mvc routing internationalization
我正在寻找一个在ASP.NET MVC网站上国际化/本地化路由的解决方案.我偶然发现Maarten Balliauw撰写的翻译路线(ASP.NET MVC和 Webforms )的博客文章.他提出了一个非常好的解决方案,效果很好 - 直到Html.RenderAction("...")视图中有一个.
基本上他引入了一个TranslatedRoute继承System.Web.Routing.Route,而不是使用带有翻译的字典进行翻译.
知道调用时这种行为有何不同Html.RenderAction("...")?此外,似乎只发生错误,如果应该呈现的操作是在同一个控制器中.
这是确切的错误:
"未找到路径'/ MyTranslatedControllerName'的控制器或未实现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
);
Run Code Online (Sandbox Code Playgroud)
这将取决于您的路线配置。你能分享一下吗?
编辑: 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; %>
Run Code Online (Sandbox Code Playgroud)
剃刀语法:
@{
ViewContext.RequestContext.RouteData.DataTokens.Add("GoingToRenderChildAction",
true);
}
@Html.Action("Action", "Controller" )
@{
ViewContext.RequestContext.RouteData.DataTokens["GoingToRenderChildAction"]=false;
}
Run Code Online (Sandbox Code Playgroud)
在 TranslatedRoute.cs 中GetVirtualPath,添加以下内容作为第一条语句:
if(requestContext.RouteData.DataTokens.ContainsKey("GoingToRenderChildAction") &&
(bool)requestContext.RouteData.DataTokens["GoingToRenderChildAction"] == true)
{
return base.GetVirtualPath(requestContext, values);
}
Run Code Online (Sandbox Code Playgroud)
这会起作用,但可能会产生不需要的副作用。
| 归档时间: |
|
| 查看次数: |
2250 次 |
| 最近记录: |