2012-04-20 7 views
5

Когда вы манипулируете данными в действии, вы часто получаете идентификатор в качестве параметра, но вам нужно выполнить некоторую обработку ошибок для этого идентификатора. Одна из ошибок обработки, которую вы должны выполнить для каждого действия, состоит в том, чтобы убедиться, что идентификатор выше 0 (а не отрицательное число). Поэтому вместо того, чтобы обрабатывать это в действии, я хотел добавить ограничение маршрута, поэтому просто не маршрутизируем действие, если его отрицательный идентификатор.Ошибка ограничения маршрута при POST

Вот мой код:

//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 

Любые идеи? Возможно, лучшее решение?

EDIT: Просто заметил что-то интересное, я сначала подумал, что сообщение об ошибке было 500, но его в 405, который является «метод не найден»

+0

Вы переписываете URL-адрес? Пути в вашем исключении не совпадают. – Robaticus

+0

не жалко, я упоминал в первом ответе, я хотел заменить действие и контроллер в обоих, но пропустил второе появление. Они оба совпадают. –

+0

Я действительно не понимаю, почему это было бы хорошо на GET и выбросить ошибку на POST –

ответ

1

Вы говорите:

HTTP глаголом POST используется для доступа к пути '/ object/edit/-2' не разрешено.

Однако за исключением состояния:

HTTP-глагол POST используется для доступа к пути '/ Профиль/editlink/-2', не допускается.

Edit:

Я думаю, что это может быть связано с вашей проблемой.

Однако это не так, как вы заявляете.

+0

да извините, я скопировал ошибку, но я хотел заменить оба, но пропустил второе появление, мое плохое. –

+3

Можете ли вы [изменить], чтобы превратить это в ответ вместо вопроса? – Will

0

Try удаления

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)] 

И посмотреть, если он просто работает (как правило, вы бы поставил [HttpPost] отрицать HttpGet и т.д.).

+0

Вы правы, хотя я просто добавил это заявление для тестирования. –

1

Я настоятельно рекомендую установить отладчик маршрутизации, найденный here. Он покажет вам, как именно данный URL обрабатывается каждым маршрутом, поэтому вы можете увидеть, что происходит на самом деле, когда вы нажимаете на этот URL. Если ваш маршрут пропущен, то вы знаете, что ваше ограничение работает, и вы можете сосредоточиться на том, что его ловит. Если ваш маршрут попал, то это проблема с действием и/или глаголами, которые он принимает.

Боковое примечание: я полностью не смог получить версию 2.0.0.7 этого отладчика, работающую корректно (в августе), но тот, который непосредственно связан с этой статьей (или версия 1.0.0.1 на NuGet), отлично работал. Я бы предположил, что текущая версия в NuGet работает, но если нет, попробуйте более старую версию.

+0

попробуем это из-за вас. –

Смежные вопросы