【问题标题】:Pass JavaScript object to controller将 JavaScript 对象传递给控制器
【发布时间】:2019-05-25 06:08:02
【问题描述】:

我正在尝试使用 JavaScript 将对象传递给控制器​​。

我使用了两个参数 _amount 和 _total 但是 回发时控制器中的值是空的。 任何想法为什么我无法获得价值? 另外,如果我想获得 _data 这是一个包含不同的对象 价值观,我将如何实现它?

var itemsCart=toys.cart._items;

$.ajax({
  url: '@Url.Action("SuccessView", "Home")',
  type: 'POST',
  data:  itemsCart,
  success: function (response) {
    alert(response);
  },
  error: function (xhr, ajaxOptions, throwError) {
    alert(xhr.responseText);
  }
});

控制器:

public IActionResult SuccessView(List<ProductViewModel> products)
  {
    return View();
  }

查看模型:

public class ProductViewModel
  {
    public string _amount { set; get; }
    public string _total { set; get; }
  }

以及来自网站的对象截图:

【问题讨论】:

  • 这个输出是什么--> console.log(itemsCart)
  • 和缺少 --> contentType: "application/json; charset=utf-8"` 在 ajax 调用中?
  • 是我上传的另存为截图
  • link 这个帖子说我不需要 contentType
  • 两件事,您的 API 是否可以在 Postman 中使用?其次,您是否尝试在您的帖子操作中使用 [FromBody]?

标签: javascript c# ajax .net-core


【解决方案1】:

替换

data: { products: itemsCart }

与

data: ({ products: itemsCart })

控制器:

public IActionResult SuccessView(ProductViewModel products)
  {
    //return View();
  }

【讨论】:

    【解决方案2】:

    听起来问题是您的参数声明为products,但您的AJAX data 参数名称与控制器操作参数名称不匹配。尝试改用此设置:

    JS

    $.ajax({
         url: '@Url.Action("SuccessView", "Home")',
         type: 'POST',
         data: { products: itemsCart },
         traditional: true,
         success: function (response) {
             alert(response);
         },
         error: function (xhr, ajaxOptions, throwError) {
             alert(xhr.responseText);
         }
    });
    

    控制器动作

    [HttpPost]
    public IActionResult SuccessView([FromBody] List<ProductViewModel> products)
    {
        // do something
    
        return new JsonResult("OK");
    }
    

    请注意,由于您的 AJAX 调用定义为 type: POST,因此您必须将 [HttpPost] 属性应用于控制器操作。

    相关问题:

    Passing A List Of Objects Into An MVC Controller Method Using jQuery Ajax

    【讨论】:

    • 我已添加您的代码,但控制器上的产品仍然为空
    • 不使用 stringify 使用 traditional: true 怎么样?由于要直接将数组作为视图模型集合传递,因此必须设置traditional: true。
    • 并删除 JSON.stringify() ?
    • 试试data: { products: itemsCart } 并设置traditional: true,因为您想将视图模型集合作为数组传递。
    • 尝试将 toys.cart._items 数组中包含的属性复制到 ProductViewModel 并查看它是否传递了值,或者创建仅包含 2 个必需属性的新数组。据我所知,要将 JS 数组传递给控制器​​动作参数,您需要匹配双方的属性数量。
    猜你喜欢
    • 2021-09-24
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多