MVC Routing: как сопоставить два имени одному действию - PullRequest
2 голосов
/ 24 февраля 2012

Я хотел бы иметь один маршрут, который дает возможность выбора двух URL, но привязан к одному действию. Хорошим примером будет многоязычное приложение. Например, английский и французский.

Поначалу это кажется простым, технически вы можете сделать:

routes.MapRoute(
  "the hi route english" ,
  "welcome/sayhi/{id}" ,
  new { controller = "Welcome" , action = "SayHi" , id = UrlParameter.Optional }
);

routes.MapRoute(
  "the hi route french" ,
  "bienvenu/direallo/{id}" ,
  new { controller = "Welcome" , action = "SayHi" , id = UrlParameter.Optional }
);

Но это означает, что вам придется определить два маршрута для каждого действия. Или немного лучшее решение, создайте собственный класс Route, который принимает больше параметров для обработки двуязычия.

Если я выберу вариант 1 или 2, это означает, что я должен определить каждый отдельный маршрут WelcomeController, потому что я не могу использовать {action} в своем маршруте.

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

т.е:.

[ActionName( { "fr", "direallo" }, {"en", "sayhi"})]
public ActionResult SayHi(string id){
     //check current thread culture...
}

Я не совсем уверен, с чего начать, есть идеи? Советы?

Спасибо,

1 Ответ

1 голос
/ 25 февраля 2012

Здесь у вас есть несколько вариантов начальных точек, примерно они (в порядке сложности реализации):

  • Маршрут для языка (как вы обрисовали в общих чертах выше)
  • Ограничение маршрута регулярного выражения например,

    routes.MapRoute(
        "the hi route",
        "{controllerName}/{actionName}/{id}",
        new { controller = "Welcome" , action = "SayHi" , id = UrlParameter.Optional },
        new { controllerName = @"welcome|bienvenu", actionName = @"sayhi|direallo" }
    );
    
  • Вы можете создать базовый контроллер, который наследуется подклассом для каждого языка, и определить имя действия для конкретного языка для каждогометод действия базового контроллера

  • Вы можете создать свой собственный (или использовать один , предоставленный в ответ на комментарий Джастина Пихони) пользовательское ограничение маршрутизации
...