我正在尝试使用路由在我的ASP.NET MVC应用程序中实现本地化。
例如:
www.example.com/Home/Index
- 将显示默认文化的内容。
www.example.com/en/Home/Index
- 将显示英文内容。
www.example.com/ru/Home/Index
- 俄语等......
所以,我为每个动作创建了本地化属性:
public class LocalizationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.RouteData.Values["lang"] != null && !String.IsNullOrWhiteSpace(filterContext.RouteData.Values["lang"].ToString()))
{
var lang = filterContext.RouteData.Values["lang"].ToString();
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(lang);
}
else
{
var langHeader = String.Empty;
langHeader = filterContext.HttpContext.Request.UserLanguages[0];
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(langHeader);
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(langHeader);
}
base.OnActionExecuting(filterContext);
}
}
我正在为控制器中的每个操作添加该属性。
注册路线:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Localization",
"{lang}/{controller}/{action}/{id}",
new { lang = "en-US", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
导航到www.example.com/About/Contacts
工作正常。
但是当我导航到www.example.com/en/About/Contacts
或类似的东西时,我得到404 error
:找不到资源。
那么,可能是什么问题?
提前感谢您的帮助!
答案 0 :(得分:2)
通过导航到www.example.com/en/About/Contacts
,您实际上仍在调用默认路由。在这种情况下,两个路由都匹配,但只匹配最后一个路由(顶部到
将被调用。
因此,当您导航到该网址时,默认路由将采用以下方式: 控制器:en 行动:关于 Id:联系人
您应该为路线添加约束以使其更具体。 或者您可以将“本地化”路线移动到“默认”路线下方,这样两者仍将匹配,但在这种情况下,最后一个将是“本地化”。
如果您将来必须解决类似问题,我建议您使用RouteDebugger NuGet包,它将帮助您了解哪些路由与请求匹配,哪一条实际执行以及哪些参数..这是Phil的链接关于它的Haack博客文章:http://haacked.com/archive/2011/04/12/routedebugger-2.aspx