控制器未接收到Ajax发送的数据

时间:2019-01-30 09:46:36

标签: jquery .net ajax asp.net-core

我正在将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; }
  }

}

3 个答案:

答案 0 :(得分:0)

您可以这样做,这是正确的方法

        $.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;

答案 1 :(得分:0)

尽管您尚未发布实际的控制器类,但我有理由确定它没有以[ApiController]属性修饰:

[ApiController]
public class MyAwesomeController : ControllerBase

似乎您正在使用标准的MVC样式的控制器,虽然该控制器和API控制器之间没有 real 区别,但现在通常都继承自{{1} }(而不是ControllerBase)并将Controller属性添加到将像API一样起作用的控制器,而不是返回视图。这导致了许多差异,其中最主要的问题就是如何绑定发布数据。

类参数的默认绑定源是[ApiController],即[FromForm]x-www-form-urlencoded编码的请求正文- not multipart/form-data。要接受诸如application/jsonapplication/json等之类的东西。该参数必须对其应用application/xml属性:

[FromBody]

当控制器具有public IActionResult AddToCart([FromBody]List<ProductInsert> data) 属性时,此逻辑相反。 [ApiController]成为默认设置,如果您需要接受标准HTML表单发布,则必须应用[FromBody]

总之,很长一段时间,由于您正在尝试发送JSON,因此立即修复是将[FromForm]添加到您的参数中。

但是,这里您还有其他一些问题,一旦解决了您的迫切问题,这些问题就会浮出水面。也就是说,您正在使用AJAX来执行标准的MVC样式的操作,该操作会进行重定向。 AJAX请求是通过瘦客户端发出的,这意味着响应本身不会自动发生。可以发出AJAX请求以自动跟随重定向,但是这样做的结果是,您将最终只剩下要重定向的整个页面,并返回到AJAX成功回调中。那时,没有任何事情要做。您无法通过JS更改整个文档的HTML。如果不自动跟随重定向,则可以从响应的[FromBody]标头中获取要跟随的URL,然后在JS中将Location设置为该URL。但是,这首先否定了使用AJAX的全部目的:您最好只执行标准的表单发布,因为结果完全相同,而无需一堆无用的JS。

如果要使用AJAX,则所命中的端点应返回您可以实际使用的东西:JSON对象或部分HTML片段。如果您选择返回JSON,则需要利用返回的数据在页面上做一些有用的事情,例如以某种方式让用户知道产品已成功添加到购物车中。如果返回部分内容,则可以在DOM中选择一些元素,并将其HTML替换为该部分HTML文档。总之,不管返回给您的AJAX成功回调什么,都必须对其进行处理-自动不会发生任何事情。

答案 2 :(得分:0)

如果您使用的是 .Net Core,很可能您必须在 API 方法声明中使用 [FromBody]:

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