Routes ASP.NET MVC 5国际化-文化始终默认

Routes ASP.NET MVC 5国际化-文化始终默认,routes,asp.net-mvc-5,globalization,Routes,Asp.net Mvc 5,Globalization,我跟随了这篇关于ASP.NET MVC 5国际化的伟大文章(由ASP.NET网站引用): 在实施之后,我只有一个无法解决的问题。 在MVC5中,在URL中使用区域性(不使用cookie),区域性始终是默认的,从不让用户通过浏览器发送首选语言 更详细的信息: 问题在于MapRoute中的区域性定义,它从站点的默认硬编码区域性开始。然后,在BeginExecuteCore中,RouteData.Values[“culture”]始终填充默认区域性,从不从Request.UserLanguages获

我跟随了这篇关于ASP.NET MVC 5国际化的伟大文章(由ASP.NET网站引用):

在实施之后,我只有一个无法解决的问题。 在MVC5中,在URL中使用区域性(不使用cookie),区域性始终是默认的,从不让用户通过浏览器发送首选语言

更详细的信息: 问题在于MapRoute中的区域性定义,它从站点的默认硬编码区域性开始。然后,在BeginExecuteCore中,RouteData.Values[“culture”]始终填充默认区域性,从不从Request.UserLanguages获取区域性。 即使url中不存在区域性,也会填充RouteData.Values[“culture”],例如,在第一次站点根访问时

如何正确地改变这种行为

也许创建两条路线,一条没有文化

关联代码:

routes.MapRoute(
        name: "Default",
        url: "{culture}/{controller}/{action}/{id}",
        defaults: new {culture = CultureHelper.GetDefaultCulture(), controller = "Home", action = "Index", id = UrlParameter.Optional }
    );

protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state)
{
    string cultureName = RouteData.Values["culture"] as string; 

    // Attempt to read the culture cookie from Request
    if (cultureName == null)               
        cultureName = Request.UserLanguages != null && Request.UserLanguages.Length > 0 ? Request.UserLanguages[0] : null; // obtain it from HTTP header AcceptLanguages
     //...
}

我发现了解决方案,需要添加另一个mapRoute(mvc默认的站点根访问),并输入区域性路由的默认值,路由顺序很重要,现在一切正常:

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            //Route order is important! First need to put culture route.

            //support for diferent languages/cultures
            routes.MapRoute(
                name: "CultureEnabled",
                url: "{culture}/{controller}/{action}/{id}",
                defaults: new { /*culture = CultureHelper.GetDefaultCulture(),*/ controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }

我发现了解决方案,需要添加另一个mapRoute(mvc默认的站点根访问),并输入区域性路由的默认值,路由顺序很重要,现在一切正常:

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            //Route order is important! First need to put culture route.

            //support for diferent languages/cultures
            routes.MapRoute(
                name: "CultureEnabled",
                url: "{culture}/{controller}/{action}/{id}",
                defaults: new { /*culture = CultureHelper.GetDefaultCulture(),*/ controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }