【问题标题】:How to handle AJAX calls after globalizating an MVC5 Website?全球化 MVC 5 网站后如何处理 AJAX 调用?
【发布时间】: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而不是RouteBaseRouteBase 处理 2 路路由(包括 URL 生成),MvcRouteHandler 仅处理匹配的传入请求。
  • 我一直在玩弄你的建议,我可以让它发挥作用,@NightOwl888。原来,第一次尝试,没看到属性部分。我将把它设置为正确答案,非常感谢你。根据我第二次的理解,约束的默认文化适用于网站的 no-lang-directory-URL。 这是预期的效果还是我的项目的不良行为? 另外,您对如何处理 URL/路由本地化有任何见解吗? URL 上的语言环境应该是 en 还是 en-UK、en-US...?
  • 是的,我们的想法是将默认文化设置为使用“标准”URL,然后任何其他语言环境都将明确包含文化。如果您还想本地化您的 URL,有一个开源项目可以帮助RouteLocalization。是的,您可以通过这种方法使用enen-GB 格式,后者需要调整正则表达式、前缀等以使用该格式。
  • @NightOwl888 非常感谢!!

标签: ajax asp.net-mvc vb.net globalization


【解决方案1】:

事实证明,@NightOwl888 的this answer 是我发现的最接近我所面临问题的解决方案。在将这些更改包含到我的项目中之后,我几乎可以解决所有问题,并且在 URL 上添加了一个很棒的文化前缀。不过,还有一些事情需要解决:

  1. 我的默认路由在 URL 中没有显示文化,这可能与我们的目标之一背道而驰。我可以处理(或删除)defaultCulture 约束。
  2. 在 js 文件中有数百个 windows.location 针对没有文化的路由。我也许可以通过存储文化的 JS 全局变量来解决这个问题。
  3. 我仍然需要找到一种处理 URL 本地化的好方法。希望this project 能帮助我度过难关(也由@NightOwl888 指导)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 2014-02-24
    • 2019-02-28
    • 1970-01-01
    相关资源
    最近更新 更多