ASP.NET (MVC) 路线国际化

2024-04-27

我正在寻找一种在 ASP.NET MVC 网站上国际化/本地化路由的解决方案。我偶然发现了这篇博客文章翻译路由(ASP.NET MVC 和 Webforms) http://blog.maartenballiauw.be/post/2010/01/26/Translating-routes-(ASPNET-MVC-and-Webforms).aspx作者:马滕·巴利奥 (Maarten Balliauw)他提出了一个非常好的解决方案,效果很好 - 直到有一个Html.RenderAction("...")视图中。

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

知道为什么调用时会有不同的行为吗Html.RenderAction("...")?而且,似乎只有当应该呈现的操作位于同一控制器中时才会发生错误。

这是确切的错误:

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

Update:

这是我的路由配置(取自 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; %>

剃刀语法:

@{
    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);
}

This will有效,但可能会产生不良副作用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET (MVC) 路线国际化 的相关文章

随机推荐