Как установить "действие по умолчанию" для моего контроллера, которое будет вызываться, когда никакое другое действие не будет соответствовать?

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

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.

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

Ответы

Ответ 1

Теперь вы можете сделать следующее.

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
}

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

Ответ 2

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

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

protected override void HandleUnknownAction(string actionName)
{
   this.View(actionName).ExecuteResult(ControllerContext);
}