2011-10-19 85 views
2

我开发了多语言asp.net mvc站点。该语言存储在URL中。默认的是英文。 我有BaseController类多语言asp.net mvc站点和路由

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" } 
      ); 

    } 

我想要做以下操作:如果当前的语言是英语,则网址不得包含“EN-US”值,因为英语是默认语言。反之亦然:如果URL中没有参数"culture"(即RouteData.Values["culture"]),则默认语言为英语。

我该怎么办?

更新:澄清我想要什么。母版页(_Layout.cshtml)包含链接的网页"About site"

@Html.ActionLink(Resources.Strings.About_LinkText, "about", "home") 

如果该网站的英文版它指向/en-us/about。但我想(如果英文网站)应该指向​​(没有en-us)。

+0

你基本上在每个请求中都需要文化,所以它必须包含在每个请求中。默认情况下,第一个参数将始终是文化。所以如果是“/ home”,那么“家”成为文化。这不是最容易做的事情。路线是否已设定或可否更改? – Buildstarted

+0

我可以改变它们。 – Alexandre

+0

你可能会想把文化移到最后一个项目,并使其成为'{* culture}',但它仍然不容易。你可能需要创建一个路由约束,并且复制你的所有路由,但不带文化参数 – Buildstarted

回答

1

此路由设置的问题是要确定路由的第一个标记是否是有效的文化名称。例如,你将不得不处理像路线:

  • /fr-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); 
} 
+0

这是一个很好的建议。但是我应该怎样处理我的问题? – Alexandre

+0

@AlexMaslakov,你有什么问题? –

+0

<<如果当前语言是英语,那么url不能包含“en-us”值,因为英语是默认语言。反之亦然:如果URL中没有参数“文化”(即RouteData.Values [“culture”]),那么默认语言设置为英语。>>换句话说:如何删除额外的值“en-我们“,如果默认文化是英文的话,那么我们就可以使用这个网址吗 – Alexandre