Это НЕ дублирующий вопрос, и проблема сводит меня с ума. Я получаю типичную ошибку «Метод публичного действия X не найден на контроллере Y», который возвращает 404 Not Found
. Скриншот дает вам хорошую идею:
На рисунке показан отладчик, приостановленный непосредственно перед выполнением строки, которая выдает исключение (base.HandleUnknownAction(actionName)
). Теперь, прежде чем делать выводы, вот некоторая информация:
- В какой-то момент это работало на отлично.
- HTTP-глагол (
GET
) должен быть принят действием UpdateCart
(см. Примечания над сигнатурой метода).
- Отправленные параметры не имеют значения: ошибка происходит с
POST
, GET
и любой комбинацией параметров.
- Другие подобные действия в том же контроллере работают хорошо.
- Я сделал снимок экрана с пометкой
UpdateCart
virtual
, но удаление virtual
не имеет значения.
- На снимке экрана показано, что
ActionInvoker.InvokeAction(this.ControllerContext, "UpdateCart")
возвращает false . Не уверен, почему отражение, выполненное на моем контроллере, не может найти метод, но оно ПРАВИЛЬНО ТАМ !!
Маршруты являются маршрутами по умолчанию, и они работают, поскольку в противном случае я бы не смог остановить отладчик, чтобы сделать снимок экрана выше. Вот код из Global.asax.cs
:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Tickets", action = "Index", id = UrlParameter.Optional }
);
}
Любые идеи приветствуются.
EDIT
Ниже приведен правильный ответ Итана Брауна: HttpGet
и HttpPost
являются взаимоисключающими. Решением было заменить эти атрибуты на [AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]
.