2013-04-18 91 views
1

我想在我的ASP.NET MVC应用程序中使用路由实现本地化。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:找不到资源。 那么,可能是什么问题?

在此先感谢您的帮助!

回答

2

通过导航到www.example.com/en/About/Contacts您实际上仍在调用默认路由。在这种情况下,两条路线都将匹配,但只有最后指定的一条(顶部至底部的 )将被调用。

所以,当您浏览的网址默认路由将承担如下: 控制器:EN 行动:关于 编号:联系人

您应该添加约束你的路线,使其更具针对性。 或者您可以将“本地化”路线移动到“默认”路线下方,这样两种方式仍然可以匹配,但在这种情况下,最后一个将是“本地化”。

如果您将来需要排除类似故障,我建议您使用RouteDebugger NuGet软件包,它可以帮助您了解哪些路由匹配请求以及哪个路由将实际执行并使用哪些参数。以下是指向菲尔哈克博客条目:http://haacked.com/archive/2011/04/12/routedebugger-2.aspx

+0

非常感谢您的帮助!我安装了RouteDebugger,它真的说了以下内容 控制器:en 操作:关于 ID:联系人。 因此,我为lang和controller添加约束: constraints:new {lang = @“^ [az] {2} $”,controller = @“^ [a-zA-Z] {3,} $”} 但仍显示: 控制器:en 操作:关于 ID:联系人。 –

+0

您无需为“本地化”路由添加约束,因为它只是使该路由更具体。正如我所说的那样,你想匹配的路线确实匹配,但是“默认”被调用,因为它是添加到路线中的最新路线(更底下的“重要”路线)。尝试切换路由的顺序或在“默认”路由中的Id参数上添加(例如)数字约束,以便它将使默认路由不再匹配该特定请求。 – chrisd84

+0

不,没有。但是我注意到,我的“本地化”路由甚至不显示在RouteDebugger的“所有路由”表中,其中显示“默认”路由。如果我删除“默认”路线,没有任何变化。 谢谢你的时间! –