JSON数组作为Null发送给控制器

时间:2018-01-18 20:32:18

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

我似乎无法在StackOverflow的其他地方找到答案,所以我现在就问它。

我正在尝试在我的API中测试更新的PUT,以便从Wordpress站点向我们的数据库提交答案数据。 API用作WP和SQL之间的中介。

我的课程:

[DataContract]
public class WordpressAnswerEntry
{
    /// <summary>
    /// Gets or sets the ID of the question the user is submitting an answer for
    /// </summary>
    [DataMember]
    public string QuestionID { get; set; }

    /// <summary>
    /// Gets or sets the data they're submitting
    /// </summary>
    [DataMember]
    public string AnswerData { get; set; }
}

简单易行。我尝试过使用int QuestionID和string

我的方法:

    [AcceptVerbs("PUT")]
    [Route("api/Questions/{applicationID}/{groupID}")]
    public HttpResponseMessage Put([FromBody] IEnumerable<WordpressAnswerEntry> answerlist, int applicationID = 0, int groupID = 0)

再一次,没什么特别的。我已经尝试过这个列表和自定义集合类。 IEnumerable是我的最后一次尝试。

我在API中有一个索引页面,用于提交测试并查看返回的JSON。以下是我的测试用例:

        $("#TestQuestionsWithAnswersButton").click(function (e) {
            e.preventDefault();

            var answerEntries = {
                answers:
                [
                    { QuestionID: "14",
                     AnswerData: "first name" },
                    { QuestionID: "15",
                     AnswerData: "last name" },
                    { QuestionID: "16",
                     AnswerData: "email here" },
                     { QuestionID: "25",
                        AnswerData: "12"
                    },
                ]
            }

            var answerlist = {
                answers: answerEntries
            };


            $.ajax({
                type: "PUT",
                url: "api/Questions/0/96",
                data: JSON.stringify(answerlist),
                contentType: "application/json; charset-utf-8",
                dataType: "json",
                success: function (data) {
                    $("#ResponseDiv").html(JSON.stringify(data));
                },
                failure: function (errMsg) {
                    alert(errMsg);
                }
            });
        });

我已经尝试了所有来让它发挥作用。我已尝试使用和不使用封装“answerList”。我曾尝试过使用和不使用stringfy。我曾尝试使用和不使用{answerlist:answerEntries}并使用或不使用stringfy。我有没有[DataMember]和[DataContract]尝试过。我有内容类型集。我有类型集。我不知道还能做什么。

每次测试都会为answerlist返回null,每次都没有失败。我不知道现在该做什么。我无法释放它,直到我能确认它有效,但我无法确认它,因为它无法正常工作。我可以正确地告诉它路由因为我的断点被击中了(我得到一个400,当答案为空时我会故意返回),但由于某种原因我不能让这个JSON数组转换。

2 个答案:

答案 0 :(得分:1)

正如评论中多次提到的那样,

正在发送的内容与控制器操作所期望的内容之间存在数据类型不匹配。

更新从客户端发送的内容...

var answerList =  [
    { QuestionID: "14",
     AnswerData: "first name" },
    { QuestionID: "15",
     AnswerData: "last name" },
    { QuestionID: "16",
     AnswerData: "email here" },
     { QuestionID: "25",
        AnswerData: "12"
    },
];

当数据以正确的格式发送时,ajax调用可以保持不变

答案 1 :(得分:0)

不是将数组添加到对象然后将该对象添加到另一个对象,而是通过以下方式发送字符串化数组:

         var  answers =
            [
                { QuestionID: "14",
                 AnswerData: "first name" },
                { QuestionID: "15",
                 AnswerData: "last name" },
                { QuestionID: "16",
                 AnswerData: "email here" },
                 { QuestionID: "25",
                    AnswerData: "12"
                }
            ];

然后在你的ajax:

data: JSON.stringify(answers)