关于创建文化并在所有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通过捕获阿拉伯语和英语的前缀文化来工作,而不试图将文化作为参数包含在内,并且没有在链接中看到任何查询字符串
感谢您的回复
答案 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()
。