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