Ajax вызов в Razor View отправляет нулевые данные в методе контроллера? - PullRequest
1 голос
/ 20 апреля 2020

Я пытаюсь сделать простой пост-вызов в методе контроллера, используя вызов ajax из вида бритвы. Вызов ajax вызывает метод контроллера, но он не отправляет объект, от которого я Попытка отправки. Я безуспешно пробовал несколько решений из Stackoverflow, включая использование метода Json.stringify() и использование атрибута [HttpPost] в методе контроллера. У меня также есть имя объекта из View, такое же, как и имя параметра метода контроллера. Это сценарий, в котором я делаю вызов Ajax:

    <script>

        $(document).ready(function () {

            
              $('.send-all').on('click', function() {
                    var data = $('#verticalScroll tr').map(function () {

                          var $row = $(this);
                          return {
                            id: $row.find('.id').text().trim(),
                            companyName: $row.find('.companyname').text().trim(),
                            price: $row.find('.price').text().trim(),
                            quantity: $row.find('.quantity').text().trim(),
                          }

                    }).get();

                      var BID = [];
                      for (var i = 0; i < data.length; i++) {
                          if (data[i].id != null && data[i].id != "") {                       
                              BID.push(data[i]);
                          }
                      }

                        $.ajax(
                        {

                            type: "POST",
                            url: "/User/UpdateBID",
                            data: BID,
                            cache: false,
                            async: true,
                            dataType: "json",
                            success: function (data) {
                                alert(data);
                      
                            },

                            });

              });

  
        });

    </script>

и это метод из контроллера:

   public ActionResult UpdateBID(object BID)
    {
        string c = JsonConvert.SerializeObject(BID);
        //Context.UpdateBID(b);
        return RedirectToAction("SesionIndividual", TempData["LoginModel"]);
    }

Метод контроллера вызывается, но объект является нулевым. Я также убедился, что JavaScript объект не равен нулю. Я также пытался отправить другие объекты просто для проверки, и у меня тот же результат, параметр в методе контроллера равен нулю.

Ответы [ 3 ]

1 голос
/ 20 апреля 2020

У меня имя объекта из View совпадает с именем параметра метода контроллера.

Имя объекта не имеет значения, поскольку это просто имя переменной. Это в любом случае преобразуется в имя data - ie data:BID = data=BID, поэтому «имя переменной», переданное через ajax, равно «data». свойства в этой переменной должны совпадать.

Краткий ответ: ваша переменная "data" нуждается в свойстве, которое соответствует имени параметра действия, ie:

data: { BID: BID },

Длинный (er) ответ: связыватель модели MVC попытается сопоставить имена свойств с именами ваших параметров. В этом случае вы затруднили себя, используя object BID вместо реальной модели, поэтому нет подходящих свойств, поэтому он может соответствовать только самому параметру.

Если вы создали модель который соответствует передаваемым данным:

public class BIDModel {
    public string companyName { get;set; }
    public string price { get;set; }
    public string quantity { get;set; }
}

и использует это в вашем действии

public ActionResult UpdateBID(BIDModel BID) 

, тогда передача data: BID будет работать, поскольку свойства data будут сопоставлены с свойства BIDModel - вы все равно можете использовать data: { BID: BID }, и связыватель модели MVC будет сопоставлять свойство data.BID с именем вашего параметра напрямую (и тогда будут отображаться свойства внутри каждого из них).


Для покрытия:

Атрибут [HttpPost] в методе контроллера.

атрибут [HttpPost] не делает его методом post - вместо ограничивает глагол http до POST. Вам, как правило, это не нужно. Это полезно, когда у вас есть два метода с одним и тем же именем, но с разными перегрузками, и один для GET с эквивалентным POST (где параметр GET просто id, но POST - полная модель). Его также можно использовать в качестве дополнительной защиты.

В вашем случае вы попадаете внутрь действия (только с нулевым параметром), так что часть явно работает нормально.

0 голосов
/ 20 апреля 2020

Для всех, кто интересуется, я понимаю, в чем проблема. Я пытался отправить массив объектов JavaScript методу, который теоретически принимал массив этих объектов. Ну, по-видимому, это не сработало. создайте новый объект в C# со свойством, имеющим тип UpdateOrder [], что-то вроде этого:

public class UpdateOrder
{
    public int id { get; set; }
    public string companyName { get; set; }
    public string price { get; set; }
    public int quantity { get; set; }
}

public class Term
{
    public UpdateOrder[] Terminal { get; set; }
}

Я создал похожий объект Term в Javascript и отправил его через AJAX в методе контроллера, и это сработало. Так что вместо прямой отправки массива я создал объект со свойством, которое содержит этот массив.

0 голосов
/ 20 апреля 2020

MVC попытается выполнить привязку из свойств модели, поэтому должно быть свойство с именем BID

data: { BID: BID }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...