Как перенаправить все недействительные URL на некоторые действия - PullRequest
1 голос
/ 21 января 2012

У меня есть контроллер Home с Index() и Foo(int id) действиями и маршрутизацией, подобными этим:

routes.MapRoute("Foo", "{id}", new { controller = "Home", action = "Foo" });

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

Таким образом, URL-адреса, такие как / и /123, работают так, как должны. Однако, когда URL-адрес /blahblah, где blahblah не является допустимым именем действия, я получаю сообщение об ошибке

Словарь параметров содержит пустую запись для параметра 'id' ненулевого типа 'System.Int32'

что, конечно, нормально, потому что действие Foo получает параметр int вместо int?

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

Таким образом, вопрос в том, возможно ли перехватить указанное выше исключение ИЛИ перенаправить все недействительные URL, такие как /blahblah, на какое-либо другое действие.

Ответы [ 2 ]

4 голосов
/ 21 января 2012

Ограничьте токен id в вашем определении маршрута Foo на число:

routes.MapRoute(
    "Foo",
    "{id}",
    new { controller = "Home", action = "Foo" },
    new { id = @"\d+" }
);

Теперь:

  • / попадет HomeController/Index
  • /123 ударит HomeController/Foo и передаст id = 123 в качестве аргумента
  • /foobar вернет 404
0 голосов
/ 21 января 2012

ЕСЛИ вы определяете функцию индекса вашего дома следующим образом со строкой id

public ActionResult Index(string id)
{
    ...
}

Тогда все ваши URL, включая / blahblah, будут указывать на нее.

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