发布到 asp.net 核心 mvc 应用程序导致空主体和空输入参数

Posting to asp.net core mvc app results in null body and null input parameter

这是我的第一个 asp.net 核心应用程序,所以我可能遗漏了一些明显的东西,但我已经查看了其他 Whosebug 答案,那里的解决方案对我没有帮助。我有一个 asp.net 核心 mvc 应用程序,我在服务结构上 运行,我正在尝试 post 一个字符串到控制器。该字符串最初是 json 个对象的数组。

我的ajaxpost:

var sendThis = { "operations": JSON.stringify(operations) };
$.ajax({
    url: '/Home/Execute',
    type: 'POST',
    data: sendThis,
    dataType: "json",
    contentType: 'application/json; charset=utf-8',
    error: function (xhr) {
        $("#save-footer-text").val("Saving failed. Please contact an administrator");
    },
    success: function (result) {
        $(".save-footer").addClass("slider");
    },
    async: true
});

我的控制器在另一边。我从另一个堆栈溢出答案中获取了流内容,但完成后它只是 returns 一个空字符串。

[HttpPost]
public IActionResult Execute([FromBody] string operations /*this is null*/)
{
    var i = 5;
    string documentContents; //this will be an empty string.
    Request.Body.Position = 0;
    using (Stream receiveStream = Request.Body)
    {
        using (StreamReader readStream = new StreamReader(receiveStream, Encoding.Unicode))
        {
            documentContents = readStream.ReadToEnd();
        }
    }
    Console.WriteLine(i);
    return new OkResult();
}

根据其他 Whosebug 的回答,我也尝试 posting 将传统设置为 true,并且我尝试 posting 操作到模型中,像这样

public class M
{
    public string status { get; set; }
    public string appName { get; set; }
    public string startTime { get; set; }
    public string endTime { get; set; }
    public string description { get; set; }
    public string operation { get; set; }
}

控制器更改为 public IActionResult Execute([FromBody] List<M> operations)

我已经检查过我的 javascript 确实发送了一个请求,Chrome 工具报告请求负载是:

operations= 我的 json 字符串在这里

我也在 Fiddler 中看到了这个,所以我知道它正在通过网络传输。

根据 的回答,我也尝试过更新 JsonSettings,但这也无济于事。

我为 asp.net 核心包使用 1.0.0-rc2-final,为服务结构使用 5.1.150。

我在这里错过了什么?抱歉,如果答案真的微不足道。感谢您的帮助。

是M个列表?

如果是,那么你的json不应该是这样的

var sendThis = { "operations": JSON.stringify(operations) }; 

试试这个:

var sendThis = JSON.stringify(operations);

我认为 asp.net 正在尝试反序列化这样一个对象:

public class Operation
{
    public List<M> Operations { get; set; }
}

如果脚本中的操作变量是一个数组

    var operations = new Array();

    var op1 = { status: 's1', appName: 'a1', startTime: 'st1', endTime: 'e1', description: 'd1', operation: 'o1' };
    operations.push(op1);

    var op2 = { status: 's2', appName: 'a2', startTime: 'st2', endTime: 'e2', description: 'd21', operation: 'o2' };
    operations.push(op2);

    var sendThis = JSON.stringify(operations);
    ...// ajax call here

并且控制器 post 方法定义如下,然后 List<M> operations 应该包含按预期通过线路发送的值。

    [HttpPost]
    public IActionResult Execute([FromBody]List<M> operations)
    {
        // ... some code here
        return Json("");
    }