Action.RouteLink不为文化

时间:2016-08-25 09:21:34

标签: asp.net-mvc localization routes

关于创建文化并在所有URL中添加前缀culture参数的帖子如下

ASP.NET MVC 5 culture in route and url

我正在制作杂志(阿拉伯语和英语)以及主页链接如下: localhost:1025 / Blog / Home //默认阿拉伯语 localhost:1025 / en / blog / home //英文

我在Controller'博客'下添加了一个名为'tag'的新操作,以显示特定标记的帖子。已经在routeConfig代码中添加了:

routes.MapRoute(
          name: "BlogListTag",
          url: "{controller}/{action}/{Name}/{page}/{pageNo}",
          defaults: new { controller = "Blog", action = "Tag", Name = UrlParameter.Optional, pageNo = UrlParameter.Optional, page = UrlParameter.Optional }

      );

所以这必须以文化约束参数作为前缀,因为代码适用:

routes.LowercaseUrls = true;
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        // Call to register your localized and default attribute routes
        routes.MapLocalizedMvcAttributeRoutes(
            urlPrefix: "{culture}/",
             defaults: new { culture = "ar" },
            constraints: new { culture = new CultureConstraint(defaultCulture: "ar", pattern: "[a-z]{2}") }
        );

现在在Home动作我在Partial视图中列出文章链接所以每篇文章都有一些标签页链接。我在局部视图中使用了这段代码

@Html.ActionLink(@t.Name,"Tag",new { Name = t.NameEn.AddDashes() },new { title= Resources.Resource.Tag+":"+ @t.Name })

当我浏览阿拉伯文时,我在浏览器中检查链接,因为:

  

localhost:1025 / blog / tag?名称= XYZ //阿拉伯语

当我切换到英文主页时

  

localhost:1025 / en / blog / tag?Name = XYZ // in English

它工作正常,它捕获文化并包含在链接中。但我不想显示与查询字符串的链接

这是问题,当我使用Html.RouteLink而不是ActionLink替换代码时,它遵循RouteConfig的路由,但不采用任何前缀文化。所以这是链接代码行:

@Html.RouteLink(@t.Name, "BlogListTag", 
new { Name = t.NameEn.AddDashes(),action="tag" },
new { title= Resources.Resource.Tag+":"+ @t.Name })
//Note: I included action because it doesn't work without it 

阿拉伯语和英语页面中的结果链接

  

localhost:1025 / blog / tag / XYZ //阿拉伯语

     

localhost:1025 / blog / tag / XYZ // in English'注意:没有文化   前缀抓住了

我的最后一次尝试是将文化作为参数包括在内,只有当文化是En

@Html.RouteLink(@t.Name, "BlogListTag", 
new { Name = t.NameEn.AddDashes(),action="tag",culture="en" },
new { title= Resources.Resource.Tag+":"+ @t.Name })
//Note: I included action because it doesn't work without it
//Note: this is only inside the if statement to check the culture as English

它会导致英文页面中的链接如下:

  

localhost:1025 / blog / tag / XYZ?culture = en // in English'注意:QueryString

我想要的就是这样:

  

localhost:1025 / blog / tag / XYZ //阿拉伯语'这已经在阿拉伯语中使用了

     

localhost:1025 / en / blog / tag / XYZ //英文

我想要的只是RouteLink通过捕获阿拉伯语和英语的前缀文化来工作,而不试图将文化作为参数包含在内,并且没有在链接中看到任何查询字符串

感谢您的回复

1 个答案:

答案 0 :(得分:0)

此设置存在多个问题。您尚未设置接受文化的网址。 URL中必须有一些变量,以告诉它您要查看哪种文化。您还有多个UrlParameter.Optional,这是不允许的(或者网址不能正确构建)。每条路线只能有一个UrlParameter.Optional参数。

第三个潜在问题是您没有以任何方式约束路线,因此如果您的网站中有其他路线,它将无法工作。我在这里展示了一个使用文字段的例子,但请注意有many ways to constrain a route并且路由排序非常重要,因为第一场比赛总是胜利。

// Localized route
routes.MapRoute(
      name: "BlogListTagWithPageLocalized",
      url: "{culture}/Blog/{action}/{Name}/{page}/{pageNo}",
      defaults: new { controller = "Blog", pageNo = UrlParameter.Optional },
      constraints: new { culture = new CultureConstraint(defaultCulture: "ar", pattern: "[a-z]{2}") }
);  

// Default culture route
routes.MapRoute(
      name: "BlogListTagWithPage",
      url: "Blog/{action}/{Name}/{page}/{pageNo}",
      defaults: new { culture = "ar", controller = "Blog", pageNo = UrlParameter.Optional }
);

// Localized route
routes.MapRoute(
      name: "BlogListTagLocalized",
      url: "{culture}/Blog/{action}/{Name}",
      defaults: new { controller = "Blog", Name = UrlParameter.Optional },
      constraints: new { culture = new CultureConstraint(defaultCulture: "ar", pattern: "[a-z]{2}") }
);

// Default culture route
routes.MapRoute(
      name: "BlogListTag",
      url: "Blog/{action}/{Name}",
      defaults: new { culture = "ar", controller = "Blog", Name = UrlParameter.Optional }
);

此外,如果您为这样的单个页面设置多个路线(您需要为本地化而设置),则不能将RouteLink与名称一起使用。您必须排除路由名称,或者使用ActionLink构建网址,以便可以匹配本地化路由或非本地化路由。

@Html.RouteLink(@t.Name, /*"BlogListTag", <-- Don't include this */
    new { Name = t.NameEn.AddDashes(),action="tag" },
    new { title= Resources.Resource.Tag+":"+ @t.Name })

请注意,如果您希望将网址翻译成不同的语言,那么您链接的解决方案将无法正常工作(至少在没有经过一些修改的情况下)。但是,有一个可能适合您的开源项目RouteLocalization(我还没有尝试过)。

  

只有在使用属性路由并且您希望属性路由已本地化时,才需要调用routes.MapLocalizedMvcAttributeRoutes()