【问题标题】:ASP.net MVC3 Multilingual Route RewritingASP.net MVC3 多语言路由重写
【发布时间】:2011-04-01 13:23:10
【问题描述】:

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


URL 架构应如下所示

http://<Domainname>/{Language}/{Controller}/{Action}/{Id}

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

这里重要的是,重定向不应被硬编码到特定语言,而应尽可能根据用户首选语言等因素来确定。

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

谢谢

【问题讨论】:

    标签: asp.net-mvc-3 internationalization asp.net-mvc-routing multilingual


    【解决方案1】:

    我通过以下路线做到了这一点;

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

    【讨论】:

    • 是否有选项没有默认语言环境的语言/
    • @Parhs 你应该通过忽略路由来处理它,这样它就不会进入 MVC 管道。例如,此路由忽略所有扩展名为 ico 的请求:routes.IgnoreRoute("{*allico}", new { allico = @".*\.ico(/.*)?" });
    猜你喜欢
    • 2010-11-19
    • 2011-10-08
    • 2012-10-18
    • 2012-04-08
    • 2015-04-12
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    相关资源
    最近更新 更多