在mvc3中动态更改路由段

时间:2013-05-24 07:40:37

标签: asp.net-mvc-3 localization globalization

我创建了两条这样的路线来执行本地化:

routes.MapRoute(
                "Default", // Route name
                "{language}/{controller}/{action}/{id}", // URL with parameters
                new { language = "en", controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
               );

routes.MapRoute(
                "Default2", 
                "{language}/{controller}/{action}/{id}/{slug}",
                new { language = "en", controller = "Home", action = "Index", id = UrlParameter.Optional, slug = UrlParameter.Optional }
               );

现在我遇到了两个问题:

  1. 默认www.mydomainname.com不会自动将en添加到网址。欲望结果:当我输入www.mydomainame.com时,它应自动更改为www.mydomainname.com/en

  2. 当我改变文化时。如何通过该文化的language segment's value替换路线上的默认TwoLetterISOLanguageName

  3. 请咨询

1 个答案:

答案 0 :(得分:1)

这是一个近似的答案,所以我希望它能让你走上正轨。

CultureInfo.TwoLetterISOLanguageName是一个非静态字段,将取决于用户,因此您将不得不使用重定向来实现此目的(它不能在global.asax文件中设置)。

一种方法是当用户请求域名时,使用普通的默认路由将它们路由到家庭控制器

 routes.MapRoute(
    name: "TypicalDefault",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
 );

在家庭控制器中,将它们重定向到正确的路径

 public ActionReult Index(){
    var routeDataDict = HttpContext.Request.RequestContext.RouteData.Values;
    routeDataDict.Add("language", CultureInfo.TwoLetterISOLanguageName);
    Response.RedirectToRoute(routeDataDict);
 }