我正在将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; }
}
}
答案 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/json
,application/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)