ASP.NET(MVC)的国际航线 [英] ASP.NET (MVC) routes internationalization

查看:156
本文介绍了ASP.NET(MVC)的国际航线的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在寻找一个解决方案,以国际化/本地化ASP.NET MVC网站上的路线。我偶然发现了博客文章<一个href=\"http://blog.maartenballiauw.be/post/2010/01/26/Translating-routes-%28ASPNET-MVC-and-Webforms%29.aspx\">Translating路线(ASP.NET MVC和Web表单)由马腾Balliauw 的。他present一个很好的解决方案,它的伟大工程 - 直到有一个 Html.RenderAction(...)视图

基本上,他引入了一个 TranslatedRoute System.Web.Routing.Route 继承,这比用做翻译在飞行翻译字典。

任何想法,为什么打电话时,此行为会有所不同 Html.RenderAction(...)?也好像如果仅发生错误,如果应该呈现的动作是在同一控制器中。

和这里的确切的错误:


  

控制器为路径/ MyTranslatedControllerName未找到或没有实现一个IController。


更新:

下面是我的路线设置(从马腾的示例项目采取增加路线联系,这是要呈现的部分):

 公共静态无效的RegisterRoutes(RouteCollection路线)
        {
            CultureInfo的cultureEN = CultureInfo.GetCultureInfo(EN-US);
            CultureInfo的cultureDE = CultureInfo.GetCultureInfo(去-DE);
            CultureInfo的cultureFR = CultureInfo.GetCultureInfo(FR-FR);            DictionaryRouteValueTranslationProvider translationProvider =新DictionaryRouteValueTranslationProvider(
                新的List&LT; RouteValueTranslation&GT; {
                    新RouteValueTranslation(cultureEN,家,家),
                    新RouteValueTranslation(cultureEN,关于,关​​于),
                    新RouteValueTranslation(cultureEN,联系人,联系方式),
                    新RouteValueTranslation(cultureDE,家,家),
                    新RouteValueTranslation(cultureDE,关于,关​​于),
                    新RouteValueTranslation(cultureDE,联系人,KONTAKT),
                    新RouteValueTranslation(cultureFR,家,Demarrer),
                    新RouteValueTranslation(cultureFR,关于,相关信息),
                    新RouteValueTranslation(cultureFR,联系人,联系方式)
                }
            );            routes.IgnoreRoute({}资源个.axd / {*} PATHINFO);            routes.MapTranslatedRoute(
                TranslatedRoute
                {控制器} / {行动} / {ID}
                新{控制器=家,行动=索引,ID =},
                新{控制器= translationProvider,行动= translationProvider},
                真正
            );            routes.MapRoute(
                默认,//路线名称
                {控制器} / {行动} / {ID},// URL带参数
                新{控制器=家,行动=索引,ID =} //参数默认
            );


解决方案

这将取决于你的路由配置。你可以分享吗?

编辑:看来的RenderAction方法是使用在路线上GetVirtualPath,以确定MvcHandler的URL。然而,一个不叫回GetRouteData的方法。

有是检测这种方法:routeData.DataTokens [ParentActionViewContext]
问题是,它涉及到后期的管道为TranslatedRoute知道这...

总之:我affraid这是不可能在System.Web.Mvc当前实现ChildActionExtensions.ActionHelper的...

我有一个(脏,自无礼)的解决方法(这也可以包装在一个自定义的RenderAction()方法):
- 在你看来,做到这一点:

 &LT;%
RouteData.DataTokens.Add(GoingToRenderChildAction
真正); %GT; &LT;%
Html.RenderAction(联系人,家);
%GT; &LT;%
RouteData.DataTokens [GoingToRenderChildAction]
= FALSE; %GT;

剃刀语法:

  @ {
    ViewContext.RequestContext.RouteData.DataTokens.Add(GoingToRenderChildAction
                                                         真正);
}@ Html.Action(动作,控制器)@ {
    ViewContext.RequestContext.RouteData.DataTokens [GoingToRenderChildAction] = FALSE;
}

在TranslatedRoute.cs GetVirtualPath ,添加以下内容作为第一个语句:

 如果(requestContext.RouteData.DataTokens.ContainsKey(GoingToRenderChildAction)及和放大器;
(布尔)requestContext.RouteData.DataTokens [GoingToRenderChildAction] ==真)
{
    返回base.GetVirtualPath(RequestContext的,值);
}

此的将会的工作,但可能有不必要的副作用。

I was looking for a solution to internationalize/localize routes on an ASP.NET MVC website. I stumbled upon the blog post Translating routes (ASP.NET MVC and Webforms) by Maarten Balliauw. He present a very nice solution, which works great - until there's a Html.RenderAction("...") in the view.

Basically he introduces a TranslatedRoute inheriting from System.Web.Routing.Route, that than does the translation using a Dictionary with the translations on the fly.

Any idea why this behaves differently when calling Html.RenderAction("...")? Also it seems like if the error only occurs, if the action that should be rendered is in the same controller.

And here's the exact error:

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

Update:

Here's my routes configuration (taken from Maarten's sample project, added routes for Contact, which is the partial to be rendered):

    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
            );

解决方案

This will depend on your route configuration. Can you share it?

EDIT: It seems the RenderAction method is using "GetVirtualPath" on the route to determine a URL for the MvcHandler. However, that one does not call back into the "GetRouteData" method.

There is a method of detecting this: routeData.DataTokens["ParentActionViewContext"] Problem is it comes to late in the pipeline for the TranslatedRoute to know about this...

In short: I'm affraid this is impossible by the current implementation of ChildActionExtensions.ActionHelper in System.Web.Mvc...

I do have a (dirty, self-disrespecting) workaround (which you can also wrap in a custom RenderAction() method): - In your view, do this:

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

Razor syntax:

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

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

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

In TranslatedRoute.cs GetVirtualPath, add the following as the first statement:

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

This will work, but may have unwanted side effects.

这篇关于ASP.NET(MVC)的国际航线的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆