Контроллер не получает данные, отправленные с Ajax - PullRequest
0 голосов
/ 30 января 2019

Я отправляю сообщение ajax на контроллер со списком данных, но контроллер получает нулевое значение

Я попытался изменить ajax или контроллер, но ничего не помогло.

[HttpPost]
public IActionResult AddToCart(List<ProductInsert> data)
{
     var userId = _userManager.GetUserId(User);

     foreach (var p in data)
     {

            if (userId == null)
            {
                throw new ApplicationException($"Unable to load user with ID '{userId}'.");
            }
            else
            {
                _repository.InsertToMyCart(p.Product_Id, userId, p.Id);
            }
     }
     return RedirectToAction("Home", "Products");
}

Вот мои сценарии:

var Id = 0;

function buyProduct(Product_Id) {
    Id++;
    var data = { Product_Id: Product_Id , Id: Id };

    $.ajax({
      url: '/MyCart/AddToCart',
      type: 'POST',
      data: JSON.stringify(data),
      dataType: 'json',
      contentType: 'application/json;charset=utf-8',
      success: function (result) {
          console.log(id);
      }
    });
}

Пространство имен ASP.NET_core_role_based_authentication.Controllers

{
    public class ProductInsert
  {
      public string Product_Id { get; set; }
      public int Id { get; set; }
  }

}

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Хотя вы еще не опубликовали свой фактический класс контроллера, я вполне уверен, что он не украшен атрибутом [ApiController]:

[ApiController]
public class MyAwesomeController : ControllerBase

Похоже, вы используете стандартныйКонтроллер в стиле MVC, который, хотя между ним и контроллером API нет real разницы, теперь типично наследовать от ControllerBase (а не Controller) и добавлять атрибут [ApiController] вконтроллеры, которые будут функционировать как API, а не возвращать представления.Это приводит к ряду различий, главное из которых заключается в том, как здесь связаны ваши данные.

Источником привязки по умолчанию для параметра класса является [FromForm], то есть x-www-form-urlencoded или multipart/form-dataтело закодированного запроса - , а не application/json.Чтобы принять что-то вроде application/json, application/xml и т. Д. К параметру должен быть применен атрибут [FromBody]:

public IActionResult AddToCart([FromBody]List<ProductInsert> data)

Когда ваш контроллер имеет атрибут [ApiController], эта логика меняется на противоположную.,[FromBody] становится значением по умолчанию, и вы должны применить [FromForm], если вам нужно принять стандартное сообщение в формате HTML.

Длинным и коротким, немедленное решение - добавить [FromBody] к вашему параметру, так как выВы пытаетесь отправить JSON.

Однако у вас также есть некоторые другие проблемы, которые приведут к появлению уродливых голов, как только вы решите свою непосредственную проблему.А именно, вы используете AJAX для выполнения стандартного действия в стиле MVC, которое выполняет перенаправление.AJAX-запросы выполняются через тонкий клиент, что означает, что с ответом автоматически ничего не происходит автоматически.AJAX-запрос может быть сделан для автоматического следования за перенаправлением, но в результате вы просто получите всю страницу, на которую перенаправлены, чтобы вернуться в ваш успешный обратный вызов AJAX.На данный момент, ничего не поделаешь.Вы не можете изменить полностью HTML-документ через JS.Если вы не выполните автоматическое отслеживание перенаправления, вы можете получить URL-адрес из заголовка Location ответа, а затем установить location в JS.Однако это сводит на нет всю цель использования AJAX в первую очередь: вы могли бы просто сделать стандартную форму публикации, так как результат будет точно таким же, просто без кучки ненужных JS.

Если вы хотите использовать AJAX, то конечная точка, которую вы ударили, должна вернуть что-то, с чем вы можете работать: объект JSON или частичный фрагмент HTML.Если вы решите вернуть JSON, вам нужно будет использовать эти возвращенные данные, чтобы сделать что-то полезное на странице, например, сообщить пользователю каким-либо образом, что продукт был успешно добавлен в корзину.Если вы вернете частичное, то вы бы выбрали некоторый элемент в DOM и заменили его HTML этим частичным HTML-документом.Короче говоря, независимо от того, что возвращается вашему успешному обратному вызову AJAX, вы должны что-то с ним делать - автоматически ничего не происходит.

0 голосов
/ 30 января 2019

вы можете сделать это следующим образом, это правильный путь

        $.ajax({
            type: "POST",
            url: "load-vorlage",
            data: {Product_Id: Product_Id, Id: Id},
            beforeSend: function () {
                // loader
            },
            error: function (response) {
                console.log(request.responseText);
            },
            success: function (data) {
                // success
            }
        });

Так что, если это не работает, вы должны проверить, имеют ли переменные значения.

другие способы

data:"{'Product_Id':'"+Product_Id+"','Id':'"+Id+"'}"

или в виде строки с &, должно быть правильным

var data = 'Product_Id='+ Product_Id  + '&Id='+ Id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...