加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

ASP.NET(MVC)路由国际化

发布时间:2020-12-16 03:43:16 所属栏目:asp.Net 来源:网络整理
导读:我正在寻找一个在ASP.NET MVC网站上国际化/本地化路由的解决方案.我偶然发现了Maarten Balliauw的 Translating routes (ASP.NET MVC and Webforms)号博客.他提出了一个非常好的解决方案,效果很好 – 直到视图中有一个Html.RenderAction(“…”). 基本上他引
我正在寻找一个在ASP.NET MVC网站上国际化/本地化路由的解决方案.我偶然发现了Maarten Balliauw的 Translating routes (ASP.NET MVC and Webforms)号博客.他提出了一个非常好的解决方案,效果很好 – 直到视图中有一个Html.RenderAction(“…”).

基本上他引入了一个继承自System.Web.Routing.Route的TranslatedRoute,而不是使用带有翻译的Dictionary进行翻译.

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

这是确切的错误:

“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"),"Contact","Contact"),new RouteValueTranslation(cultureDE,"Kontakt"),new RouteValueTranslation(cultureFR,"Demarrer"),"Infos"),"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",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);
}

这可行,但可能有不良副作用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读