【问题标题】:Web Api 2 receive json arrayWeb Api 2 接收 json 数组
【发布时间】:2017-02-27 14:19:26
【问题描述】:

型号

public class modelVenta {
    public int idvendedor { get; set; }
    public int idcliente { get; set; }
    public int idproducto { get; set; }
    public int cantidad { get; set; }
    public decimal precio { get; set; }
    public DateTime fecha { get; set; }
}

public class modelVentas {
    public List<string> modeloVenta { get; set; }
}

控制器

[HttpPut]
[Route("api/ventas/Add")]
public HttpResponseMessage putVentas( List<modelVentas> data)
{
    return new HttpResponseMessage { StatusCode = HttpStatusCode.OK };
}

JSON

var data = [{
        "idvendedor": 1,
        "idcliente": 1,
        "idproducto": 1,
        "cantidad": 2,
        "precio": 12.0,
        "fecha": 1476445327124
    }, {
        "idvendedor": 1,
        "idcliente": 1,
        "idproducto": 2,
        "cantidad": 4,
        "precio": 23.0,
        "fecha": 1476445327124
    }, {
        "idvendedor": 1,
        "idcliente": 1,
        "idproducto": 1,
        "cantidad": 4,
        "precio": 35.0,
        "fecha": 1476445327124
    }];

发送数据

$http.put("http://localhost:54233/api/ventas/Add", JSON.stringify({
        modeloVenta: data
    })).then(function () {
        toastr.info('Elemento insertado correctamente');
    });

我在http://jsonlint.com/ 中验证 Json 并且没问题,但是每次我从 AngularJS、api 控制器 web 发送时,总是收到 Null。 请社区,有人可以帮我解决这个问题吗?

【问题讨论】:

  • 您的 putVentas 方法似乎没有做任何事情,而是返回 HTTP 200 状态代码?还是只是为了测试?您能否澄清一下 - 您是说 List&lt;modelVentas&gt; data 参数是 null 并且您想知道为什么吗?
  • 看起来你正在发送一个列表,但接收到一个列表列表,也许这是你的问题。
  • 我同意@OmriAharon - 您在 API 中收到的类型是 List&lt;List&lt;string&gt;&gt;。这不需要是List&lt;modelVenta&gt; 吗?
  • return HTTP 200 状态码是假的,但是当我在控制器上进行调试时,数据总是为空
  • 尝试用List&lt;modelVenta&gt; data替换List&lt;modelVentas&gt; data

标签: c# angularjs arrays json asp.net-web-api2


【解决方案1】:

您的 putVentas() 方法需要 List&lt;modelVentas&gt; - modelVentas 仅具有 List&lt;string&gt; 的属性。

您发送的 JSON 实际上是 List&lt;modelVenta&gt;,DefaultModelBinder 将尝试从它接收的 JSON 数据中将其反序列化为您在签名中指定的类型。

这就是为什么datanull,因为它不能转换为方法签名所期望的类型。


您的 JSON 正在尝试将 modelVenta 列表传递给方法。

要解决此问题,您需要更新 API 方法以匹配 JSON 发送的类型。将 API 方法的签名更改为:

public HttpResponseMessage putVentas(List<modelVenta> data)
{
    // do something with the data

    return new HttpResponseMessage { StatusCode = HttpStatusCode.OK };
}

您的 DefaultModelBinder 应该会发现您正在传递 List&lt;modelVenta&gt;

【讨论】:

  • 感谢@djgeoffjames 发送的修复,控制器运行正常
  • 没问题@GabrielSule -- 很高兴我能帮上忙。如果有用,请不要忘记为答案投票;如果这是您使用的解决方案,请尽可能标记为已接受的答案。快乐编码! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多