2012-01-21 2 views
1

У меня есть контроллер дома с 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 не является допустимым именем действия я получаю ошибку

Словарь параметров содержит пустую запись для параметра «» ид из ненулевых типа «System.Int32»

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

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

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

ответ

4

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

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

Сейчас:

  • / ударит HomeController/Index
  • /123 ударит HomeController/Foo и передать id = 123 в качестве аргумента
  • /foobar возвратит 404
+0

Отлично, вот что мне нужно :) – user1121956

+0

Вау, не знал, что это возможно. –

0

Если вы определяете функцию Index Home, как следующая с идентификатором строки

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

Затем все URL, в том числе/blahblah укажут на него.

Смежные вопросы