Сбой формы MVC3 POST с «используется для доступа к пути ... не разрешено» - PullRequest
1 голос
/ 30 декабря 2011

Я пытаюсь добавить на страницу пост, созданный с помощью Javascript.

Я начал со следующего определенного маршрута:

routes.MapRoute(name: "ItemLinks", url: "ItemRequestController/DoItemRequest", defaults: new { controller = "ItemRequest", action = "DoItemRequest" });

Но я не смог получить значения формы из объекта запроса в методе действия моего контроллера.

Итак, я определил следующий маршрут:

routes.IgnoreRoute("ItemRequestController/{*pathInfo}");

Форма определяется как:

@using (Html.BeginForm("DoItemRequest", "ItemRequestController", FormMethod.Post))
{
    @Html.AntiForgeryToken()
    <input type="hidden" name="hid_ItemID" value="" />
    <input type="hidden" name="hid_PositionOnPage" value="" />

В функции js я определяю значения (на основе щелчка) скрытых полей, затем выполняю:

document.forms[0].submit();

Проблема в том, что я сейчас получаю сообщение об ошибке ...

HTTP-глагол POST, используемый для доступа к пути '/ ItemRequestController / DoItemRequest' не допускается.

Как мне обойти это и прочитать значения POST формы в методе действия моего контроллера?

- ОБНОВЛЕНИЕ -

Не могу поверить, что я забыл добавить это ...

Я уверен, что есть более изящный способ получения запроса var ... открытый для предложений.

Метод контроллера:

[ValidateAntiForgeryToken]
[HttpPost]
public ActionResult DoItemRequest()
{
    int itemListID = 0;
    int pagePositionNumber = 0;
    int.TryParse(Request["itemListID"], out itemListID);
    int.TryParse(Request["pagePositionNumber"], out pagePositionNumber);

Ответы [ 2 ]

2 голосов
/ 31 декабря 2011

Убедитесь, что ваш метод контроллера определен как HttpPost

[HttpPost] // Or [AcceptVerbs(HttpVerbs.Post)]
public ActionMethod DoItemRequest(FormCollection data)
{
}
0 голосов
/ 31 декабря 2011
  1. Прежде всего удалите свою игнорируемую часть из Global.asax

  2. Теперь перейдем к вопросу.MVC основан на соглашении (реализация по умолчанию). Используйте это.

    @using (Html.BeginForm("DoItemRequest", "ItemRequest", FormMethod.Post))
    {
    @Html.AntiForgeryToken()
    <input type="hidden" name="hid_ItemID" value="" />
    <input type="hidden" name="hid_PositionOnPage" value="" />
    

Вы должны указать только имя контроллера, для которого ItemRequest не ItemRequestController.Ваш класс - ItemRequestController, но постфиксный Controller по умолчанию Add by MVC.Поэтому, когда вы используете ItemRequestController в BeginForm, он будет искать класс ItemRequestControllerController, который не найден, и генерируется исключение.

Это решит вашу проблему.

...