1

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

在此先感谢您的帮助!

4

1 回答 1

2

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

因此,当您导航到该 url 时,默认路由将假定以下内容: Controller: en Action: About Id: Contacts

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

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

于 2013-04-18T20:17:53.543 回答