Как установить "действие по умолчанию" для моего контроллера, которое будет вызываться, когда никакое другое действие не будет соответствовать?
Скажем, у меня есть следующий маршрут:
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);
}