Ajax.BeginForm не правильно конструирует Action?

331
10 августа 2017, 20:59

Есть форма для добавления товара в корзину:

@using (Ajax.BeginForm("AddCart","Cart" , new AjaxOptions { UpdateTargetId = "res" }, new { style = "margin-top: 20px" }))
    {
        <div class="text-center">
            @Html.HiddenFor(r => r.Id)
            <input type="submit" class="btn btn-for-product" value="Добавить в корзину" />
        </div>
    }

Вот что генерируется в итоги:

<form action="/Products/AddCart?Length=4" data-ajax="true" data-ajax-mode="replace" data-ajax-update="#res" id="form0" method="post" style="margin-top: 20px" novalidate="novalidate">        <div class="text-center">
            <input data-val="true" data-val-number="Значением поля Id должно быть число." data-val-required="Требуется поле Id." id="Id" name="Id" type="hidden" value="24">
            <input type="submit" class="btn btn-for-product" value="Добавить в корзину">
        </div>
</form>

Ключевое тут в том что action="/Products/AddCart?Length=4", а должно action="/Cart/AddCart". В хелпере указан контроллер Cart и метод действия AddCart. А хелпер генерирует странный action. У меня вопрос, почему хелпер формирует странный action?? И, как из хелпера можно решить эту проблему??

Answer 1

В Вашем коде вызывается не тот перегруженый вариант Ajax.BeginForm, на который Вы рассчитывали. К перечисленным параметрам подходит

public static MvcForm BeginForm(this AjaxHelper ajaxHelper, string actionName, object routeValues, AjaxOptions ajaxOptions, object htmlAttributes)

а нужен

public static MvcForm BeginForm(this AjaxHelper ajaxHelper, string actionName, string controllerName, object routeValues, AjaxOptions ajaxOptions, object htmlAttributes)

Из вариантов с четырьмя параметрами компилятором выбран такой, в котором типы Ваших значений могут быть приведены к ожидаемым. Cтрока "Cart" в этом случае рассматривается как object routeValues - обратите внимание на свойство Length=4 после ? в адресной строке. А контроллер берется текущий.

Правильно:

@using (Ajax.BeginForm("AddCart", "Cart", null, 
  new AjaxOptions { UpdateTargetId = "res" }, new { style = "margin-top: 20px" }))
{
  ...
}
READ ALSO
Ожидание в асинхронности

Ожидание в асинхронности

Есть абстрактный пример:

279
WPF. Максимальный размер текста в Label

WPF. Максимальный размер текста в Label

Нужна помощьКак узнать, какой размер шрифта (свойство FontSize) в Label будет максимальным для полного отображения (без каких-либо обрезаний букв...

383
Вывод коллекции

Вывод коллекции

Есть массив и список такого же типаВ цикле я изменяю массив и после каждого изменения добавляю его в список (по окончанию цикла хочу получить...

395