MVC3 Маршрут / проблема перенаправления - PullRequest
0 голосов
/ 02 июля 2011

Мое приложение многоязычное, и я написал следующий маршрут для обработки языков:

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

Это работает для domain.com и domain.com/pt/home/index. Однако, если я наберу domain.com/home/index, произойдет сбой (404) .

Желаемым поведением будет перенаправление на domain.com/pt/home/index (pt - язык по умолчанию).

Каков наилучший способ достичь этого? Я много читал о маршрутах и ​​ActionFilters, но, похоже, ничего не подходит.

Ответы [ 3 ]

3 голосов
/ 02 июля 2011

Я бы предложил использовать пользовательский обработчик маршрута, как показано ниже

public class LanguageRouteHandler : IRouteHandler
    {
        public IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            IRouteHandler handler = new MvcRouteHandler();
            var vals = requestContext.RouteData.Values;
            if(vals["language"] == null)
            {
                vals["language"] = "pt";

            }
            return handler.GetHttpHandler(requestContext);
        }
    }

и иметь другой маршрут без значения языкового маршрута и установить его обработчик маршрута (global.asax)

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

Это не будет перенаправлять Home / index на pt / home / index, но обеспечит language = "pt" для вашего метода действия индекса (и всех остальных). если вы хотите перенаправить, вы можете реализовать actionfilter, но перенаправление создаст проблемы с почтовыми запросами. Например, когда вы публикуете форму в / home / index и предполагаете, что она перенаправлена ​​с помощью фильтра действий, перенаправленный запрос потеряет опубликованные данные формы

1 голос
/ 02 июля 2011

Вам нужны два маршрута, другой без языка или добавьте параметр языка в конце

0 голосов
/ 02 июля 2011

Попробуйте это

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

и измените свое действие таким образом

public ActionResult Index([DefaultValue("pt")] string language)
{
    ...
}
...