Это не дублирующий вопрос, и проблема сводит меня с ума. Я получаю типичную ошибку "Открытый метод действия 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 }
);
}
Любые идеи приветствуются.
ИЗМЕНИТЬ
Этан Браун отвечает правильно: HttpGet
и HttpPost
являются взаимоисключающими. Решение заключалось в замене этих атрибутов на [AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]
.