ASP.net MVC3 переписывание многоязычных маршрутов - PullRequest
5 голосов
/ 01 апреля 2011

Есть ли хороший способ создания переписывания маршрутов для многоязычного веб-приложения?

<ч />

Схема URL должна быть следующей

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

но URL-адреса без языковой части также должны поддерживаться, но они должны не просто отображаться на контроллеры напрямую, но генерировать ответ перенаправления.

Здесь важно то, что перенаправление не должно быть жестко закодировано на конкретный язык, а должно определяться на основе таких факторов, как предпочтительный язык пользователя, если это возможно.

Примечание: Процесс определения правильного языка не проблема, просто как выполнить нестатическое переписывание.

Спасибо

1 Ответ

4 голосов
/ 03 апреля 2011

Мне удалось это с помощью следующих маршрутов:

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

Я работаю с культурой, переопределяя метод GetControllerInstance () в DefaultControllerFactory.пример ниже;

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