MVC 5 网站全球化后如何处理 AJAX 调用?
How to handle AJAX calls after globalizating an MVC5 Website?
背景
继承了一个电子商务网站,使用的是常用的aspnet的MVC5 / razor / jquery。目标是使网站国际化并添加语言选择器,以支持两个主要的 country/language 定位策略。我刚刚完成了第一步,即路由网站,以便它处理域。com/en/,域。com/es/,域。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
有 千 次 "inline" AJAX 次对跨网站路由的调用没有 @Html 助手编写,因为该项目有单独的,捆绑的 js 文件,失败。有 数百 条路由失败,因为项目控制器正在使用属性路由并且没有指定语言环境。例如,对产品功能的简单 link 失败,因为控制器具有指定
的路由
/product/{id}
但是 URL 看起来像
/es-MX/product/{id}
问题:
这里的正确方法是什么?
我原以为没有区域设置的 AJAX 和 link 会被重定向,但它们没有。
我是否应该重写所有这些文件以便它们指定当前语言环境?有没有其他 "healthy" 方法可以做到这一点,比如扩展 BaseController 并添加文化作为路由前缀?
预先感谢您的宝贵时间,我在这里迷路了。
事实证明,@NightOwl888 的 是我找到的最接近我所面临问题的解决方案。将此更改包含到我的项目后,我几乎完成了所有工作,并在 URL 上展示了一个美妙的文化前缀。不过还有一些事情需要解决:
- 我的默认路线在 URL 中没有文化,这可能违背我们的目标之一。我可以处理(或删除)defaultCulture 约束。
- js 文件中有数百个 windows.location 针对没有文化的路由。我可以通过存储文化的 JS 全局变量来解决这个问题。
- 我仍然需要找到一种很好的方法来处理 URL 本地化。希望 this project 能帮助我度过难关(也由 @NightOwl888 指导)。
背景
继承了一个电子商务网站,使用的是常用的aspnet的MVC5 / razor / jquery。目标是使网站国际化并添加语言选择器,以支持两个主要的 country/language 定位策略。我刚刚完成了第一步,即路由网站,以便它处理域。com/en/,域。com/es/,域。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
有 千 次 "inline" AJAX 次对跨网站路由的调用没有 @Html 助手编写,因为该项目有单独的,捆绑的 js 文件,失败。有 数百 条路由失败,因为项目控制器正在使用属性路由并且没有指定语言环境。例如,对产品功能的简单 link 失败,因为控制器具有指定
的路由/product/{id}
但是 URL 看起来像
/es-MX/product/{id}
问题:
这里的正确方法是什么?
我原以为没有区域设置的 AJAX 和 link 会被重定向,但它们没有。
我是否应该重写所有这些文件以便它们指定当前语言环境?有没有其他 "healthy" 方法可以做到这一点,比如扩展 BaseController 并添加文化作为路由前缀?
预先感谢您的宝贵时间,我在这里迷路了。
事实证明,@NightOwl888 的
- 我的默认路线在 URL 中没有文化,这可能违背我们的目标之一。我可以处理(或删除)defaultCulture 约束。
- js 文件中有数百个 windows.location 针对没有文化的路由。我可以通过存储文化的 JS 全局变量来解决这个问题。
- 我仍然需要找到一种很好的方法来处理 URL 本地化。希望 this project 能帮助我度过难关(也由 @NightOwl888 指导)。