【问题标题】:My controller don't receive the IDs of an AJAX request我的控制器没有收到 AJAX 请求的 ID
【发布时间】:2015-05-20 21:56:39
【问题描述】:

我有一个 JavaScript 函数,它使用 AJAX 请求将数据发送到我在 asp.net MVC 上的控制器。看:

function verCarrinho() {
$.ajax({
    type: "POST",
    url: "/Produto/Carrinho",
    data: { "carrinho": carrinho },
    success: function (e) {
    }
});
}

其中 carrinho 是一个具有两个属性的数组。其中一个属性是我需要发送到我的控制器以使用 EF 对我的数据库进行查询的 ID。

我在控制器上的 ActionNResult:

[HttpPost]
    public ActionResult Carrinho(List<Carrinho> carrinho)
    {
        var ids = carrinho.Select(s => s.idLivro).ToList();
        var resultado = db.Produtos.Where(w => ids.Contains(w.idProduto));
        return PartialView("_Carrinho", resultado);
    }

问题是:我的变量“resultado”保持为空! AJAX 不发送 ID。如果我在 resultado 上设置断点,我可以看到 AJAX 发送对象,但我看不到 ID。

我有一个与我的参数类型相同的类:

public class Carrinho
{
    public int idLivro;
    public int qtdProduto;
}

我不知道我能不能说清楚,但我希望你能帮忙。

谢谢。

【问题讨论】:

  • 将对象转换为 JSON 并将 JSON 作为字符串发送给调用,然后在方法内部将字符串转换回对象
  • @jcuenod 当然,我的错,对不起!我现在就这样做!谢谢你们。我不能投票给你的答案,因为我没有这方面的声誉,但我接受了我自己的答案,比如解决方案,这只是我能做到的。再见。

标签: javascript c# ajax asp.net-mvc


【解决方案1】:

您需要 data: JSON.stringify({ "carrinho": carrinho }) 并在 ajax 调用中添加 contentType: 'application/json; charset=utf-8',

【讨论】:

    【解决方案2】:

    Javascript 对象文字语法!== JSON。

    你需要在你的ajax请求中JSON.stringify()你的data对象。

    【讨论】:

      【解决方案3】:

      我根据朋友的代码更改了我的代码,它可以工作。它看起来像这样:

      namespace WebAppImaginario.Models
      {
      public class ItemCarrinho
        {
          public int idLivro { get; set; }
          [DisplayName("Quantidade do Produto")]
          public int qtdProduto { get; set; }
          [DisplayName("Nome do Produto")]
          public string nomeProduto { get; set; }
          [DisplayName("Descrição do Produto")]
          public string descProduto { get; set; }
          [DisplayName("Preço do Produto")]
          public decimal precProduto { get; set; }
          [DisplayName("Desconto da Promoção")]
          public decimal descontoPromocao { get; set; }
          [DisplayName("Imagem")]
          public byte[] imagem { get; set; }
        }
      }
      

      控制器:

      [HttpPost]
          public ActionResult Carrinho(string hidCarrinho)
          {
              List<ItemCarrinho> listaCarrinho = new List<ItemCarrinho>();
      
              if (hidCarrinho != null)
              {
                  var itens = JsonConvert.DeserializeObject<List<ItemCarrinho>>(hidCarrinho);
      
                  foreach (var item in itens)
                  {
                      var qtd = int.Parse(new string(item.qtdProduto.ToString().Where(char.IsDigit).ToArray()));
                      if (qtd > 0)
                      {
                          var idLivroNumerico = int.Parse(new string(item.idLivro.ToString().Where(char.IsDigit).ToArray()));
                          var resultado = db.Produtos.Where(m => m.idProduto == idLivroNumerico).FirstOrDefault();
                          ItemCarrinho prod = new ItemCarrinho();
                          prod.idLivro = idLivroNumerico;
                          prod.qtdProduto = qtd;
                          prod.nomeProduto = resultado.nomeProduto;
                          prod.descProduto = resultado.descProduto;
                          prod.precProduto = resultado.precProduto;
                          prod.descontoPromocao = resultado.descontoPromocao;
                          prod.imagem = resultado.imagem;
                          listaCarrinho.Add(prod);
                      }
                  }
              }
      
              return View(listaCarrinho);
          }
      

      JavaScript:

      function setValueEnviar() {
      $("#hiddenInputContainer").empty();
      
      for (var i = 0; i < carrinho.length; i++) {
          var newInput = document.createElement('input');
          newInput.type = "hidden";
          newInput.value = JSON.stringify(carrinho[i]);
          newInput.name = 'data';
          $("#hiddenInputContainer").append(newInput);
       }
      }
      
      $('#formCarrinho').submit(function (e) {
        e.preventDefault();
        $('#hidCarrinho').val(JSON.stringify(carrinho));
        document.formCarrinho.submit();
      })
      

      这些 ID 是我页面上的一个表单和隐藏的输入。我不知道它是否清楚,但它对我有用。

      感谢大家的支持。

      【讨论】:

        【解决方案4】:

        data: { "carrinho": carrinho } 之类的语法可以工作,$.ajax 确实接受 PlainObject 作为 data(请参阅 http://api.jquery.com/jquery.ajax/)。

        您的问题是您的变量 carrinho 不符合 PlainObject 的要求。

        PlainObject 类型是一个包含零个或多个键值对的 JavaScript 对象

        http://api.jquery.com/Types/#PlainObject

        根据carrinho 是什么,您可能会成功使用stringify 作为替代方案:

        function verCarrinho() {
          $.ajax({
            type: "POST",
            url: "/Produto/Carrinho",
            data: JSON.stringify({ "carrinho": carrinho }),
            success: function (e) {
            }
          });
        }
        

        【讨论】:

        • 嗨。还是错了:/!感谢您的回答,也感谢 ozil 和 Alex!我的 AJAX 是这样的,现在: function verCarrinho() { $.ajax({ type: "POST", url: "/Produto/Carrinho", contentType: "application/json; charset=utf-8", data: JSON .stringify({ "carrinho": carrinho }), 成功: function (e) { $("#listaProdutos").html(e); } }); } #listaProdutos 是一个空的 ul 标记。当我在控制器上调试结果变量时,有空值:(
        • @Pasch console.log(carrinho) 的输出是什么?
        • 嗨。我根据朋友的代码更改了我的代码,它可以工作。我会把它贴在这里的答案,好吗?如果您能再次发表评论,我会很感激。
        猜你喜欢
        • 1970-01-01
        • 2018-02-28
        • 2016-10-22
        • 2015-09-23
        • 2012-07-19
        • 2020-08-06
        • 1970-01-01
        • 2015-01-13
        • 1970-01-01
        相关资源
        最近更新 更多