c# - 将多个 JSON 记录发送到 .NET Controller

标签 c# jquery asp.net json asp.net-core

我构建了一个使用 JQuery ajax 向我的 .NET Controller 发送单个 JSON 记录的解决方案,该解决方案运行良好,如下所示..

$.ajax({
  data: JSON.stringify({'prodId': 1041, 'sizeId': "XS", 'pdtWeight': 2.3}),
  contentType: "application/json; charset=utf-8",
  type: 'POST',
  url: '@Url.Action("AdjustWeight", "ProductBins")',
  success: function (data) {
    //do something great here
  }
});

这是 Controller “ProductBins”中的代码:“AdjustWeight”

[Route("ProductBins")]
[ApiController]
public class ProductBinsController : Controller
{
  private readonly ApplicationDbContext applicationDbContext;
  public ProductBinsController(ApplicationDbContext _applicationDbContext)
  {
    applicationDbContext = _applicationDbContext;
  }
  [HttpPost]
  [Route("AdjustWeight")]
  public JsonResult AdjustWeight(AdjustWeightRequest adjustWeightRequest)
  {
    var AdjWt = (
      from pr in applicationDbContext.Products
      join pc in applicationDbContext.Prodcolors on pr.ProdId equals pc.ProdId
      join pd in applicationDbContext.Proddetails on pc.PclId equals pd.PclId
      where pr.ProdId == adjustWeightRequest.ProdId && pd.PdtSize == adjustWeightRequest.SizeId                
      select pd.PdtId               
    ).ToList();

    var prodDetailsToUpdate = applicationDbContext.Proddetails.Where(i => AdjWt.Contains(i.PdtId));

    foreach (var item in prodDetailsToUpdate)
    {
      item.PdtWeight = adjustWeightRequest.PdtWeight;
    }
    applicationDbContext.SaveChanges();
    return Json(true);
  }
}

这是AdjustWeightRequest 类代码..

public class AdjustWeightRequest
{
  public int ProdId { get; set; }
  public string SizeId { get; set; }
  public decimal PdtWeight { get; set; }
}

上面的所有代码都非常棒。正是我需要它做的事情。但是,我可能需要向 Controller 发送 1 个或多个 JSON 记录。在上面的示例中,我只发送 1 个 JSON 记录,效果很好。出于测试目的,我在 JavaScript 函数中硬编码了以下内容,该函数发送 2 个 JSON 记录...

$.ajax({
  data: JSON.stringify([{'prodId': 1041, 'sizeId': "XS", 'pdtWeight': 2.3}, {'prodId': 1041, 'sizeId': "S", 'pdtWeight': 3.2}]),
  contentType: "application/json; charset=utf-8",
  type: 'POST',
  url: '@Url.Action("AdjustWeight", "ProductBins")',
  success: function (data) {
    //do something great here
  }
});

请注意方括号的添加以及每个记录中的细微差别(sizeId 和 pdtWeight)。因此,我假设我需要在 Controller 中执行一些 foreach 循环来处理每个 JSON 记录(1 个或多个)并相应地更新数据库。但是,在我到达那里之前,我从 Controller 收到了 Javascript 400 Bad Request 错误,因此我尝试在 Controller 类或请求类中放置断点并进行调试不起作用。看来添加方括号不起作用,因为当我使用方括号对工作代码(单个记录)进行简单调整时,我得到了相同的 400 Bad Request 错误。

仅供引用,我对 JSON 进行了硬编码,以便进行测试并便于在本文中进行解释。最终的解决方案将构建一个 JavaScript 数组并将其传递给 JSON.stringify,后者会自动添加方括号。希望这些信息足以提供一些见解。

已解决...@AussieJoe 解决方案效果很好。这是更新后的 Controller 代码..

public JsonResult AdjustWeight(AdjustWeightRequest[] adjustWeightRequest)
{
  foreach (var item2 in adjustWeightRequest)
  {
    var AdjWt = (
      from pr in applicationDbContext.Products
      join pc in applicationDbContext.Prodcolors on pr.ProdId equals pc.ProdId
      join pd in applicationDbContext.Proddetails on pc.PclId equals pd.PclId
      where pr.ProdId == item2.ProdId && pd.PdtSize == item2.SizeId
      select pd.PdtId
    ).ToList();

    var prodDetailsToUpdate = applicationDbContext.Proddetails.Where(i => AdjWt.Contains(i.PdtId));

    foreach (var item in prodDetailsToUpdate)
    {
      item.PdtWeight = item2.PdtWeight;
    }
    applicationDbContext.SaveChanges();
  }
  return Json(true);
}

最佳答案

您的 Controller 设置为一次仅允许一个对象...但在第二个示例中,您尝试在 stringify 调用中传入一个数组。

将 API Controller 的方法签名更改为:

public JsonResult AdjustWeight(AdjustWeightRequest[] adjustWeightRequest)

这将允许对象数组,而不是单个对象。

关于c# - 将多个 JSON 记录发送到 .NET Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66649222/

相关文章:

javascript - 带缩略图和灯箱的 jQuery 图片库

asp.net - Z-Index属性不适用于youtube视频

c# - System.DateTime 种类位

c# - KeyPressed 事件调用其他事件

c# - 重置下拉值

javascript - 本地页面可以接受文本值并在 Internet URL 上以值作为参数打开新选项卡吗?

c# - 抽象类中的抽象属性。重点是什么?

javascript - 使用 .hide() 隐藏导航栏

c# - 使用相同应用程序服务的多个应用程序

asp.net - 如何以漏斗形状排列一堆 DIV 标签?