Asp.net mvc 3 ASP.net MVC3多语言路由重写

Asp.net mvc 3 ASP.net MVC3多语言路由重写,asp.net-mvc-3,internationalization,asp.net-mvc-routing,multilingual,Asp.net Mvc 3,Internationalization,Asp.net Mvc Routing,Multilingual,有没有什么好方法可以为多语言web应用程序创建路由重写 URL架构应如下所示 http://{Language}/{Controller}/{Action}/{Id} 但是也应该支持没有语言部分的URL,但是它们不应该直接映射到控制器,而是生成重定向响应 这里重要的一点是,重定向不应硬编码为特定语言,而应根据用户首选语言等因素确定(如果可能) 注意:确定正确语言的过程不是问题,而是如何进行非静态重写 谢谢我通过以下途径做到了这一点 routes.MapRoute(

有没有什么好方法可以为多语言web应用程序创建路由重写


URL架构应如下所示

http://{Language}/{Controller}/{Action}/{Id}

但是也应该支持没有语言部分的URL,但是它们不应该直接映射到控制器,而是生成重定向响应

这里重要的一点是,重定向不应硬编码为特定语言,而应根据用户首选语言等因素确定(如果可能)

注意:确定正确语言的过程不是问题,而是如何进行非静态重写


谢谢

我通过以下途径做到了这一点

    routes.MapRoute(
            "Default", // Route name
            "{language}/{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", language = "tr", id = UrlParameter.Optional }, // Parameter defaults
            new { language = @"(tr)|(en)" }
        );
我通过重写DefaultControllerFactory的GetControllerInstance()方法来处理区域性。下面是一个例子

public class NinjectControllerFactory : DefaultControllerFactory {

protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) {

    //Get the {language} parameter in the RouteData

    string UILanguage;

    if (requestContext.RouteData.Values["language"] == null) {

        UILanguage = "tr";
    }
    else {

        UILanguage = requestContext.RouteData.Values["language"].ToString();
    }

    //Get the culture info of the language code
    CultureInfo culture = CultureInfo.CreateSpecificCulture(UILanguage);
    Thread.CurrentThread.CurrentCulture = culture;
    Thread.CurrentThread.CurrentUICulture = culture;

    return base.GetControllerInstance(requestContext, controllerType);
}

}
并在global.asax上注册

protected void Application_Start() {

    //other things here


    ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
}

是否有不使用默认locale/@Parhs语言的选项?您应该通过忽略路由来处理此问题,这样它就不会进入MVC管道。例如,此路由忽略具有ico扩展名的所有请求:
routes.IgnoreRoute(“{*allico}”,new{allico=@.*\.ico(/.*)”})