【问题标题】:MVC5 Localization with culture in route - issues with having an AreaMVC5 本地化与路线中的文化 - 有一个区域的问题
【发布时间】:2015-01-14 00:13:03
【问题描述】:

我查看了以下博客文章,并按照布局实现了代码:

ASP.NET MVC 5 Internationalization

在我的 MVC5 应用程序中没有区域,它运行得非常好。用户导航到http://localhost,并且我的浏览器的默认语言设置为意大利语(它),我最终得到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,但在该区域内不存在该名称的控制器 (有一个根HomeController)。

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

我希望让这项工作发挥作用,因为我想保留这些区域,并且我还试图避免使用 cookie(我宁愿在 URL 中包含文化)。

【问题讨论】:

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


    【解决方案1】:

    我在这篇国际化帖子之后遇到了同样的问题,并通过添加 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 }
            );
        }
    

    如果你在不同的区域有相同的控制器/动作,你也必须添加命名空间。

    希望它也对你有用。

    【讨论】:

    • 谢谢 - 这是为我做的。此外,我最终交换了global.asax 中路由注册的顺序,以便首先注册区域,然后是基本默认路由。
    【解决方案2】:

    在同一个问题苦苦挣扎了一段时间后,我找到了一个适合我的答案。 在您的 Global.asax 中,只需确保在注册区域之前注册路线:

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

    【讨论】:

    • 谢谢 - 这是我尝试的第一件事,但没有任何作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2013-05-16
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 2012-08-07
    相关资源
    最近更新 更多