ASP.NET MVC路由。资源未找到

时间:2013-04-18 19:33:45

标签: asp.net-mvc localization routing

我正在尝试使用路由在我的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:找不到资源。 那么,可能是什么问题?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

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

因此,当您导航到该网址时,默认路由将采用以下方式: 控制器:en 行动:关于 Id:联系人

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

如果您将来必须解决类似问题,我建议您使用RouteDebugger NuGet包,它将帮助您了解哪些路由与请求匹配,哪一条实际执行以及哪些参数..这是Phil的链接关于它的Haack博客文章:http://haacked.com/archive/2011/04/12/routedebugger-2.aspx