【问题标题】:array data not being sent to API controller c#数组数据未发送到 API 控制器 c#
【发布时间】:2017-07-23 19:49:00
【问题描述】:

我正在开发 angularJS 应用程序,我在其中进行后期调用以将数据发送到 API 控制器,除了数据数组之外,所有内容都被发送到控制器。

这是调用控制器的代码

this.UpdateJobWithDeadlines = function (JobData) {
    var request = $http({
        method: "POST",
        url: "/api/JobAPI/UpdateJobWithDeadlines",
        data: JSON.stringify(JobData)
    });
    return request;
}

我检查了 JobData 对象,它的值(为了便于阅读而缩进)是:

{
    "jobNum":null,
    "jobName":"fgfg",
    /* snip */
    "StatusDatas":[
        {
            "scId":0,
            "JobNum":9746.030148450296,
            "StatusComment":"03-03-2017 : 1",
            "scTimeStamp":"2017-03-03T15:47:48.174Z",
            "IsNew":0
        },
        {
            "scId":0,
            "JobNum":8527.946898255957,
            "StatusComment":"03-03-2017 : 3",
            "scTimeStamp":"2017-03-03T15:47:49.459Z",
            "IsNew":0
        }
    ],
    /* SNIP */
    "telephone":"9"
}

控制器方法签名如下:

public int UpdateJobWithDeadlines(JobDataWithDeadlines JobData)

JobDataWithDeadlines 类如下:

public class JobDataWithDeadlines
{
    public int? jobNum;
    public string jobName;
    /* snip */
    public List<StatusData> StatusDatas;
}

public class StatusData
{
    public int scId;
    public int JobNum;

    public string StatusComment;

    public string scTimeStamp;

    public bool IsNew;
}

但我得到一个空列表,用于控制器方法参数的 StatusDatas 属性。

【问题讨论】:

  • 你试过[FormBody] JobDataWithDeadlines JobData
  • 旁注:使用double 代替Jobnum ;)。
  • 我认为您的 json 在 StatusDatas 部分中不正确
  • 这是复制/粘贴错误吗? telephone 右侧只有一组引号。
  • 最好将你的 api 与客户端分开测试。使用休息控制台或其他 chrome 插件/扩展之一。一旦你知道让你的 API 工作需要什么......那么如果你无法从 JS 调用它,你就会知道这是一个 JS 问题

标签: c# angularjs


【解决方案1】:

问题在于您的字段,它们都需要是属性。 json.net 的反序列化和序列化不会绑定到字段(无论如何,开箱即用,可以使用额外的配置/自定义映射代码)。

public class JobDataWithDeadlines
{
    public int? jobNum {get;set;}
    public string jobName {get;set;}
    /* snip */
    public List<StatusData> StatusDatas {get;set;}
}

public class StatusData
{
    public int scId {get;set;}
    public double JobNum {get;set;}
    public string StatusComment {get;set;}
    public string scTimeStamp {get;set;}
    public bool IsNew {get;set;}
}

您还应该在请求的 http 标头中指定 content-type。在这种情况下,将其设置为application/json

【讨论】:

    【解决方案2】:

    您必须将以下属性添加到您传递给$http 方法的对象中:

    this.UpdateJobWithDeadlines = function (JobData) {
        var request = $http({
            method: "POST",
            contentType: "application/json",
            dataType: "json",
            url: "/api/JobAPI/UpdateJobWithDeadlines",
            data: JSON.stringify(JobData)
        });
        return request;
    }
    

    您可以选择为内容类型指定字符集,即:

    contentType: 'application/json; charset=utf-8'
    

    有些人还建议在其中添加traditional: true,但根据我的经验,这并不总是导致此问题的原因。

    【讨论】:

      猜你喜欢
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 2019-10-21
      • 1970-01-01
      • 2017-06-01
      • 2019-10-18
      • 2021-04-07
      相关资源
      最近更新 更多