Asp.net mvc 3 多语言asp.net mvc站点和路由

Asp.net mvc 3 多语言asp.net mvc站点和路由,asp.net-mvc-3,routing,razor,Asp.net Mvc 3,Routing,Razor,我开发了多语言asp.NETMVC网站。该语言存储在url中。默认值为英语。 我有BaseController类 protected override void OnActionExecuting(ActionExecutingContext filterContext) { string culture = filterContext.RouteData.Values[MvcApplication.CultureParamerName] as strin

我开发了多语言asp.NETMVC网站。该语言存储在url中。默认值为英语。 我有BaseController类

protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            string culture = filterContext.RouteData.Values[MvcApplication.CultureParamerName] as string;
            if (string.IsNullOrWhiteSpace(culture))
                culture = Facade.Common.GetLocale(BECulture.Cultures.English);//==en-us
            Thread.CurrentThread.CurrentCulture = new CultureInfo(culture);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);
            base.OnActionExecuting(filterContext);
        }
还有一些路线

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Photos_Route",
            "{culture}/photos/{action}/{id}",
            new { controller = "photos", action = "show", culture = "en-us" }
            );
        routes.MapRoute(
            "PhotosDownload_Route",
            "{culture}/photos/{action}/{id}/resolution/{measure1}x{measure2}",
            new { controller = "photos", action = "download", culture = "en-us" }
            );

        routes.MapRoute(
            "Pages_Router",
            "{culture}/page/{id}",
            new { controller = "home", action = "page", id = UrlParameter.Optional, culture = "en-us" }
            );

        routes.MapRoute(
            "Tags_Route", // Route name
            "{culture}/tag/{tag}", // URL with parameters
            new { controller = "photos", action = "ShowPhotosByTag", culture = "en-us" } // Parameter defaults
            );



routes.MapRoute(
            "Home_Route",
            "{culture}/{action}",
            new { controller = "home", culture = "en-us" }
            );

        routes.MapRoute(
            "Default_Route",
            "{culture}/{controller}/{action}/{id}",
            new { controller = "home", action = "index", id = 1, culture = "en-us" }
            );

    }
我想做以下事情:如果当前语言是英语,那么url不能包含“en-us”值,因为英语是默认语言。反之亦然:如果url中没有参数
“culture”
(即
RouteData.Values[“culture”]
),则默认语言为英语

我怎么做

更新:关于我想要什么的澄清。母版页(_Layout.cshtml)包含指向页面的链接
“关于站点”


如果网站使用英语,则指向
/en-us/about
。但是我希望(如果网站是英文的)它应该指向
/about
(不带en-us)。

此路由设置的问题是确定路由的第一个标记是否是有效的区域性名称。例如,您必须处理以下路线:

  • /fr/home/index
  • /home/index
第一种情况是
culture=“fr fr”
,第二种情况是
culture=“home”
。因此,为了解决这个问题,您可以尝试以下方法:

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    string culture = filterContext.RouteData.Values["culture"] as string;
    var ci = CultureInfo
        .GetCultures(CultureTypes.AllCultures)
        .FirstOrDefault(x => x.Name == culture);
    if (ci == null)
    {
        // we couldn't find a suitable culture => fallback to default
        ci = new CultureInfo("en-US");
    }

    Thread.CurrentThread.CurrentCulture = ci;
    Thread.CurrentThread.CurrentUICulture = ci;
    base.OnActionExecuting(filterContext);
}

基本上,您在每个请求中都需要文化,因此它必须包含在每个请求中。默认情况下,第一个参数始终为区域性。因此,如果是
/home
,那么“home”就成了文化。这不是最容易做到的事。路线设置好了吗?或者您可以更改它们吗?您可能希望将区域性移动到最后一项,并使其成为
{*culture}
,但是这仍然不容易。您可能需要创建管线约束并复制所有没有区域性的管线parameter@AlexMaslakov,你的问题是什么?@AlexMaslakov,你的路线很好,应该能满足你的要求,还有我关于
OnActionExecuting
方法的建议。你试过了吗?我想从url中删除“en-us”。例如,/home/index和/en us/home/index以英语显示相同的内容。@AlexMaslakov,这正是此设置(您的路由和我的OnActionExecuting)将要发生的情况。我再次重复我的问题:你试过了吗?你遇到什么问题了吗?如果有,您会看到
/home/index
/en-us/home/index
都会在主控制器上显示索引操作,且culture=en-us。
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    string culture = filterContext.RouteData.Values["culture"] as string;
    var ci = CultureInfo
        .GetCultures(CultureTypes.AllCultures)
        .FirstOrDefault(x => x.Name == culture);
    if (ci == null)
    {
        // we couldn't find a suitable culture => fallback to default
        ci = new CultureInfo("en-US");
    }

    Thread.CurrentThread.CurrentCulture = ci;
    Thread.CurrentThread.CurrentUICulture = ci;
    base.OnActionExecuting(filterContext);
}