MVC5本地化与路线文化 - 有一个区域的问题

时间:2014-10-18 14:11:33

标签: c# localization asp.net-mvc-5

我已经看了下面的博客文章,并按照以下方式实现了代码:

ASP.NET MVC 5 Internationalization

在我的MVC5应用程序中没有区域,它的效果非常好。用户导航到http://localhost并使用我的浏览器的默认语言设置为意大利语(it),我最终得到http://localhost/it。完美。

在我的应用程序中注册了一个区域,一切都崩溃了。按上述方式导航至http://localhost的用户最终会尝试点击不存在的http://localhost/it/myarea/Home

根据引用的博客文章,这是我所拥有的:

我的路线配置

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

            //routing to include culture
            routes.MapRoute(
                name: "DefaultWithCulture",
                url: "{culture}/{controller}/{action}/{id}",
                defaults: new { culture = string.Empty, controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}

我的区域注册

namespace MyWebsite.Areas.WindowShop
{
    public class MyAreaRegistration : AreaRegistration 
    {
        public override string AreaName 
        {
            get 
            {
                return "myarea";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context) 
        {
            context.MapRoute(
                "myarea_default",
                "{culture}/myarea/{controller}/{action}/{id}",
                new { action = "Index", culture = string.Empty, id = UrlParameter.Optional }
            );
        }
    }
}

如果路由中尚未提供浏览器,我应该注入浏览器的文化{。}}。

BaseController

我怀疑有些东西搞砸了路由,因为我们似乎(启用了区域)尝试命中区域内的namespace MyWebsite.Code { public class BaseController : Controller { protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state) { string cultureName = RouteData.Values["culture"] as string; if (string.IsNullOrEmpty(cultureName)) cultureName = Request.UserLanguages != null && Request.UserLanguages.Length > 0 ? Request.UserLanguages[0] : null; // obtain it from HTTP header AcceptLanguages // some validation cultureName = CultureHelper.GetImplementedCulture(cultureName); if (RouteData.Values["culture"] as string != cultureName) { RouteData.Values["culture"] = cultureName.ToLowerInvariant(); Response.RedirectToRoute(RouteData.Values); } Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultureName); Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; return base.BeginExecuteCore(callback, state); } } } ,但是没有该名称的控制器该区域(有一个根HomeController)。

我真的不明白为什么,当该区域在播放时,我们最终会尝试重定向到不存在的控制器。

我希望让这个工作,因为我想保留这些区域,我也在努力避免使用cookie(我宁愿在URL中使用文化)。

2 个答案:

答案 0 :(得分:2)

经过一段时间的努力,我找到了一个适合我的答案。 在您的Global.asax中,只需确保在注册区域之前注册路线

protected void Application_Start()
{
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    AreaRegistration.RegisterAllAreas();
    // ...
}

答案 1 :(得分:2)

我在这个国际化帖子之后有同样的问题并通过添加area = AreaName作为默认区域路由的参数并将area =“”作为默认路由的参数来解决它:

区域路线配置:

    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "myarea_default",
            "{culture}/myarea/{controller}/{action}/{id}",
            new { action = "Index", culture = string.Empty, area = AreaName, id = UrlParameter.Optional }
        );
    }

路线配置:

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

        //routing to include culture
        routes.MapRoute(
            name: "DefaultWithCulture",
            url: "{culture}/{controller}/{action}/{id}",
            defaults: new { culture = string.Empty, controller = "Home", action = "Index", area = "", id = UrlParameter.Optional }
        );
    }

如果在不同的区域中具有相同的控制器/操作,则还必须添加命名空间。

希望它也适合你。