Ошибка ограничения маршрута на POST
Когда вы манипулируете данными в действии, вы часто получаете идентификатор в качестве параметра, но вам необходимо выполнить некоторую обработку ошибок для этого идентификатора. Одна из обработок ошибок, которую вы должны выполнить для каждого действия, - убедиться, что идентификатор больше 0 (не отрицательное число). Поэтому вместо того, чтобы обрабатывать это в действии, я хотел добавить ограничение маршрута, чтобы просто не направлять действие, если оно имеет отрицательный идентификатор.
Вот мой код:
//route definition
routes.MapRoute(
"default route" ,
"{controller}/{action}/{id}" ,
new { id = UrlParameter.Optional },
new { id = @"^\d+$" }
);
//action definition (note I also tried with only [HttpPost] and with nothing same result
[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get )]
public ActionResult Edit( int id )
Все работает нормально, когда вы выполняете GET для действия, но когда я отправляю POST, я получаю следующую ошибку, когда нужно просто перейти на страницу 404
HTTP verb POST used to access path '/object/edit/-2' is not allowed.
[HttpException (0x80004005): The HTTP verb POST used to access path '/object/edit/-2' is not allowed.]
System.Web.DefaultHttpHandler.BeginProcessRequest(HttpContext context, AsyncCallback callback, Object state) +740
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +632
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +194
Есть идеи? Возможно, лучшее решение?
РЕДАКТИРОВАТЬ: Просто заметил что-то интересное, я сначала подумал, что сообщение об ошибке было 500, но это 405, который "метод не найден"
3 ответа
Ты говоришь:
HTTP-глагол POST, используемый для доступа к пути '/object/edit/-2', недопустим.
Однако исключение гласит:
HTTP-глагол POST, используемый для доступа к пути "/profile/editlink/-2", недопустим.
Редактировать:
Я думаю, что это может быть связано с вашей проблемой.
Однако это не так, как вы утверждаете.
Я настоятельно рекомендую установить отладчик маршрутизации, найденный здесь. Он покажет вам, как именно данный URL анализируется каждым маршрутом, так что вы можете увидеть, что на самом деле происходит, когда вы нажимаете этот URL. Если ваш маршрут пропускается, то вы знаете, что ваше ограничение работает, и вы можете сосредоточиться на том, что его ловит. Если ваш маршрут находится под ударом, то это проблема с действием и / или глаголами, которые он принимает.
Примечание: мне совершенно не удалось заставить корректно работать версию 2.0.0.7 этого отладчика (еще в августе), но та, которая была указана непосредственно в статье (или версия 1.0.0.1 на NuGet), работала нормально. Я бы предположил, что текущая версия в NuGet работает, но если нет, попробуйте старую версию.
Попробуйте удалить
[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get )]
И посмотрите, работает ли он просто (обычно вы бы поставили [HttpPost], чтобы запретить HttpGet и т. Д.).