Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC5本地化与路线中的文化-与区域相关的问题_C#_Localization_Asp.net Mvc 5 - Fatal编程技术网

C# MVC5本地化与路线中的文化-与区域相关的问题

C# MVC5本地化与路线中的文化-与区域相关的问题,c#,localization,asp.net-mvc-5,C#,Localization,Asp.net Mvc 5,我看了下面的博文,并按照所述实现了代码: 在我的MVC5应用程序中没有区域,它工作得非常好。用户导航到http://localhost 当我的浏览器的默认语言设置为意大利语时,我最终会使用意大利语http://localhost/it. 太好了 在我的应用程序中注册了一个区域后,一切都崩溃了。导航到的用户http://localhost 正如上面所说的那样,他最终试图击中http://localhost/it/myarea/Home,这是不存在的 根据引用的博客文章,以下是我所拥有的: 我的路

我看了下面的博文,并按照所述实现了代码:

在我的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

我真的不明白为什么,当这个区域处于活动状态时,我们最终试图重定向到一个不存在的控制器


我希望这项工作能够正常进行,因为我希望保留这些区域,同时我也试图避免使用cookies,我更希望URL中有文化背景。

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

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

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

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

我在这篇国际化文章之后遇到了同样的问题,并通过添加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 }
        );
    }
路由配置:

    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 }
        );
    }
如果在不同的区域中有相同的控制器/操作,则还必须添加名称空间


希望它也能对您起作用。

在这篇国际化文章之后,我遇到了同样的问题,并通过添加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 }
        );
    }
路由配置:

    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中交换了路由注册的顺序,以便首先注册区域,然后注册基本默认路由。谢谢-这为我做到了。此外,我最终在global.asax中交换了路由注册的顺序,以便首先注册区域,然后注册基本默认路由。