【问题标题】:ASP.NET MVC Routing. Resource not foundASP.NET MVC 路由。找不到资源
【发布时间】:2013-04-18 19:33:45
【问题描述】:

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

提前感谢您的帮助!

【问题讨论】:

    标签: asp.net-mvc localization routing


    【解决方案1】:

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

    因此,当您导航到该 url 时,默认路由将假定如下: 控制器:zh 行动:关于 ID:联系人

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

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

    【讨论】:

    • 非常感谢您的帮助!我安装了 RouteDebugger,它确实显示了以下控制器:en Action:About ID: Contacts。所以,我为 lang 和 controller 添加约束: constraints: new { lang = @"^[a-z]{2}$", controller = @"^[a-zA-Z]{3,}$" } 但仍然显示this: Controller: en Action:About ID: Contacts.
    • 向“本地化”路由添加约束并不重要,因为它只会使该路由更加具体。正如我所说,您要匹配的路由实际上匹配,但是会调用“默认”,因为它是添加到路由中的最新路由(底部更“重要”的路由)。尝试切换路由的顺序或在“默认”路由中的 Id 参数上添加(例如)数字约束,这样默认路由将不再与该特定请求匹配。
    • 不,没什么。但我注意到我的“本地化”路线甚至没有显示在 RouteDebugger 的“所有路线”表中,其中显示了“默认”路线。如果我删除“默认”路线,没有任何改变。感谢您的宝贵时间!
    猜你喜欢
    • 2014-01-05
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2012-10-27
    相关资源
    最近更新 更多