.NET核心javascript到控制器POST

.NET核心javascript到控制器POST,javascript,c#,asp.net-core,Javascript,C#,Asp.net Core,我不确定哪里出了问题,我有一个对象无法发布到我的控制器 型号: public class PostJsonModel { public List<JsonModel> Things { get; set; } } public class JsonModel { public int Id { get; set; } public string Tests { get; set; } public string MoreTests { get; se

我不确定哪里出了问题,我有一个对象无法发布到我的控制器

型号:

public class PostJsonModel
{
    public List<JsonModel> Things { get; set; }
}

public class JsonModel
{
    public int Id { get; set; }
    public string Tests { get; set; }
    public string MoreTests { get; set; }
}
当我闯入控制器时,
PostJsonModel
的“Things”计数为0。 看看chrome中的网络输出,
allSaveElements
正是我所期望的

这在.NETFramework(4.7)应用程序中工作得非常好,但由于某些原因,.NETCore(2.2)中没有


我显然遗漏了什么,有人能指出吗?

我想你需要在参数前面加上[FromBody]

[HttpPost]
公共异步任务DoSomething([FromBody]PostJsonModel测试)
{
...

}

您绑定到一个复杂对象,并从主体传递数据,在这种情况下,您需要使用FromBody

这在.NETFramework(4.7)应用程序中工作得非常好,但是 由于某些原因,不在.NET核心(2.2)中

你是对的,大约一年前我在过渡到.NETCore2.1时就注意到了这一点。在.NETFramework中,如果只为复杂对象发送一个参数,则不需要使用FromBody,但在.NETCore中,则需要使用它

您可能希望查看Microsoft提供的以下链接:

引用同一链接

如果默认行为没有给出正确的结果,可以使用 以下属性之一,用于指定要用于任何 给定目标

[FromQuery]-从查询字符串中获取值

[FromRoute]-从路由数据获取值

[FromForm]-从发布的表单字段获取值

[FromBody]-从请求正文获取值

[FromHeader]-从HTTP头获取值


您是否尝试在action参数之前使用[FromBody]属性?我认为您需要将[FromBody]放在参数
公共异步任务DoSomething([FromBody]PostJsonModel test)
之前使用XMLHttpRequest是否有原因?JQuery Ajax帖子可能是一个更好的选择。@GaryStewart此项目不使用JQuery。我们在过去遇到过一些问题,所以我们尝试在没有它的情况下完成这个项目。感谢大纲和文档,它真的很有帮助。我不得不说,我对这件事感到很尴尬。你不必感到尴尬,我已经去过了。很高兴知道它帮助了你:)
    [HttpPost]
    public async Task<IActionResult> DoSomething(PostJsonModel test)
    {
        //Save to the database

        return Json("Success");
    }
    var test = {
        "Id": 5,
        "Tests": "Testing",
        "MoreTests": "More More More"
    };

    var more = [];

    more.push(test);
    more.push(test);
    more.push(test);

    var allSaveElements = {
        "Things": more
    };

    let xhr = new XMLHttpRequest();
    xhr.open('POST', '/Home/DoSomething', true);
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.onload = function () {
        if (xhr.status === 200) {
           //Do something
        }
        else {
            alert('Request failed.  Returned status of ' + xhr.status);
        }
    };
    xhr.send(allSaveElements);