【发布时间】:2018-01-23 08:40:05
【问题描述】:
背景
我继承了一个电子商务网站,使用通常的 aspnet 的 MVC5/razor/jquery。目标是对网站进行全局化并添加语言选择器,以支持两种主要的国家/语言定位策略。我刚刚完成了第一步,即路由网站,以便它处理 domain.com/en/, domain.com/es/, domain.com/es-mx/... 使用http://jittuu.com/2014/3/17/AspNet-localization-routing 在此之后,输入具有不存在区域设置的域重定向到默认区域。有一个自定义的 IRouteHandler 可以获取 httprequest,检查语言环境并在需要时放置它:
Public Class LocalizationRedirectRouteHandler
Implements IRouteHandler
Public Function GetHttpHandler(requestContext As RequestContext) As IHttpHandler Implements IRouteHandler.GetHttpHandler
Dim routeValues = requestContext.RouteData.Values
Dim cookieLocale = requestContext.HttpContext.Request.Cookies("locale")
If cookieLocale IsNot Nothing Then
routeValues("culture") = cookieLocale.Value
Return New RedirectHandler(New UrlHelper(requestContext).RouteUrl(routeValues))
End If
Dim uiCulture = CultureInfo.CurrentUICulture
routeValues("culture") = uiCulture.Name
Return New RedirectHandler(New UrlHelper(requestContext).RouteUrl(routeValues))
End Function
End Class
有 数千个 的“内联”AJAX 调用在没有使用 @Html 帮助程序的情况下编写的网站上的路由,因为该项目具有单独的捆绑 js 文件,因此失败。有 数百个 路由失败,因为项目控制器正在使用属性路由并且它没有指定语言环境。例如,产品功能的简单链接失败,因为控制器有一个指定的路由
/product/{id}
但网址看起来像
/es-MX/product/{id}
问题:
这里的正确方法是什么?
我原以为那些没有语言环境的 AJAX 和链接会被重定向,但事实并非如此。
我应该重写所有这些文件,以便它们指定当前语言环境吗?有没有其他“健康”的方式来做到这一点,比如扩展 BaseController 并添加文化作为路由前缀?
提前感谢您的宝贵时间,我在这里迷路了。
【问题讨论】:
-
见ASP.NET MVC 5 culture in route and url。这描述了如何修复
AttributeRouting来处理这个问题。但是,您链接的文章中的方法存在问题 1)它使用重定向,而不是路由在站点周围移动(对 SEO 非常不利)2)它使用 HTTP 处理程序而不仅仅是扩展路由 3)它扩展了MvcRouteHandler而不是RouteBase。RouteBase处理 2 路路由(包括 URL 生成),MvcRouteHandler仅处理匹配的传入请求。 -
我一直在玩弄你的建议,我可以让它发挥作用,@NightOwl888。原来,第一次尝试,没看到属性部分。我将把它设置为正确答案,非常感谢你。根据我第二次的理解,约束的默认文化适用于网站的 no-lang-directory-URL。 这是预期的效果还是我的项目的不良行为? 另外,您对如何处理 URL/路由本地化有任何见解吗? URL 上的语言环境应该是 en 还是 en-UK、en-US...?
-
是的,我们的想法是将默认文化设置为使用“标准”URL,然后任何其他语言环境都将明确包含文化。如果您还想本地化您的 URL,有一个开源项目可以帮助RouteLocalization。是的,您可以通过这种方法使用
en或en-GB格式,后者需要调整正则表达式、前缀等以使用该格式。 -
@NightOwl888 非常感谢!!
标签: ajax asp.net-mvc vb.net globalization