Как мне установить «Действие по умолчанию» для моего Контроллера, которое будет вызываться, если не найдено других действий? - PullRequest
15 голосов
/ 19 ноября 2008

Скажите, у меня есть следующий маршрут:

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

Позвольте также сказать, что мой контроллер имеет следующие методы: Index(Int32 id) и Edit(Int32 id).

Таким образом, /MyController/Index/1 является действительным URL для этого маршрута. Так же /MyController/Edit/1

Однако, если получен URL-адрес, который корректно сопоставляется с моим контроллером, но не с существующим действием, как определить «Действие по умолчанию» для выполнения вместо того, чтобы позволить инфраструктуре MVC вызвать экран ошибок?

По сути, я бы хотел, чтобы URL /MyController/Preview/1 и /MyController/Whatever/1 выполняли действие, которое я определяю заранее, когда токен {action} не может быть сопоставлен с существующим действием на моем контроллере.

Я вижу, что проект MvcContrib в Codeplex имеет атрибут, который позволяет использовать его с ConventionController, но я бы хотел пока сохранить его с чистым MS ASP.NET MVC.

Я также вижу, что Фредрик упоминает атрибут [ControllerAction(DefaultAction = true)], но я не могу найти упоминание о нем нигде, кроме его блога (и мое приложение не будет компилироваться, когда я попробую его в своем контроллере) .

Ответы [ 2 ]

12 голосов
/ 19 ноября 2008

На данный момент вы можете сделать следующее.

protected override void HandleUnknownAction(string actionName) {
  //your code here.
}

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

routes.MapRoute("default-action", "{controller}/{actionName}/{id}", new {action="DefaultAction"});

Который отображается на

public ActionResult DefaultAction(string actionName, string id) {
  //handle default action
}

Это дает вам результат, который вы ищете.

8 голосов
/ 15 марта 2012

Farooq Kaiser сделал статью на CodeProject на эту тему, которая мне показалась полезной: Обработка неизвестных действий в ASP.NET MVC

Мне особенно нравится хитрость создания страниц «только для просмотра» (очевидно, следует добавить код обработки ошибок):

protected override void HandleUnknownAction(string actionName)
{
   this.View(actionName).ExecuteResult(ControllerContext);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...