ASP.NET MVC: много маршрутов -> всегда только один контроллер

#asp.net-mvc #routing

#asp.net-mvc #маршруты

Вопрос:

У меня очень простой вопрос. Мой сайт, основанный на ASP.NET MVC может иметь много URL-адресов, но все они должны приводить к одному контроллеру. Как это сделать?

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

Например, у меня есть url / about, / product / id и т.д. Но Все они должны действительно приводить к контенту / показывать, где будут распознаны части URL и будет принято решение, какую информацию показывать. Это что-то вроде CMS, когда вы не можете определить маршруты заранее. Достаточно ли этой информации?

Спасибо

Комментарии:

1. Также было бы полезно, если бы вы привели несколько примеров URL-адресов и того, что вы хотите сделать с ними в контроллере.

2. Проблема не в том, что мне нужны какие-то «бесконечные» параметры, но URL может быть коротким, например /products / id, но он должен переходить к содержимому. показывать контроллер всегда вместо продуктов. Например, индекс.

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

4. как человек, который сейчас ищет решение, в котором кто-то сделал именно это… если кто-то еще хочет это сделать .. пожалуйста, просто нет!

Ответ №1:

Это звучит как ужасная идея, но, ну, если вы должны;

 routes.MapRoute(
    "ReallyBadIdea",
    "{*url}",
    new { controller = "MyFatController", action = "MySingleAction" }
    );
  

Это перенаправляет все к одному действию в одном контроллере. Также есть {*path} и другие шаблоны URL, если вы хотите немного большей гибкости.

Комментарии:

1. Почему плохая идея? Для этого есть законное использование. Если ваше приложение переписывает URL в браузере и соответственно загружает контент, то независимо от URL вы хотите загрузить базовую страницу. Ajax позаботится о rest позже на стороне клиента.

2. Да, маму, это не просто плохая идея. Я думаю, что мир программирования — это мир создания, а не мир использования. Спасибо mamu за обнародование вашей идеи создания.

Ответ №2:

В идеале вы должны попробовать конкретизировать свои маршруты, например, если у вас есть URL-адрес /products / 42, и вы хотите, чтобы он переходил к универсальному контроллеру, вы должны указать его явно, например

 routes.MapRoute(
    "Poducts",
    "products/{id}",
    new { controller = "Content", action = "Show", id = UrlParameter.Optional }
    );
  

затем вы должны указать другой маршрут для чего-то другого, например / customers / 42

 routes.MapRoute(
        "Customers",
        "customers/{id}",
        new { controller = "Content", action = "Show", id = UrlParameter.Optional }
        );
  

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