【发布时间】: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