ASP.NET Core:从jQuery发布复杂类型总是导致'null'模型

时间:2016-02-16 15:06:30

标签: asp.net-core

我正在尝试从jQuery发布到我的ASP.NET Core(RC1)API。当我通过HttpClient POST时它工作正常,所以我认为这只是一个我不知道的蠢事。

我可以在vanilla默认的ASP.NET 5项目和此代码上重现我的问题。

服务器

namespace WebApplication1.Controllers
{
    [Route("api/[controller]")]
    public class ValuesController : Controller
    {
        [HttpPost]
        public IActionResult Post([FromBody]Model input)
        {
            // input is always null

            return Json(input.Value);
        }


        public class Model
        {
            public string Value { get; set; }
        }
    }
}

客户端

$.ajax({
    url: "http://localhost:5000/api/values",
    method: "POST",
    contentType: "application/json",
    dataType: "json",
    data: JSON.stringify({
        Value: "some_value"
    })
}).done(function(data) {
    console.log("Done.", data);                         
});  

我通过删除[FromBody]来玩,返回一个模型,但从未填充过属性。我也在SO上尝试了类似问题的许多解决方案和解决方法,但我认为它们不适用于.NET Core或仅用[FromBody]和简单类型来解决问题。例如Web Api Parameter always nullusing jQuery post to ASP.Net webapihttp://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/

1 个答案:

答案 0 :(得分:4)

我又花了几个小时,直到我终于明白了。正如我所担心/希望的那样,这只是一个愚蠢的事情:

Fiddler发现我的CORS配置存在小问题。意识到我在Chrome中完全禁用了CORS,它突然开始工作了。服务器端代码按原样运行,这是最小的工作客户端代码:

$.ajax({
    url: "http://localhost:5000/api/values",
    method: "POST",
    contentType: "application/json",
    data: JSON.stringify({
        value: "some_value"
    })
}).done(function(data) {
    console.log("Done.", data);                         
});  

请注意contentType是必需的,如果没有它,模型绑定将无法正常工作。

当然,之前我曾尝试过这个客户端代码,但CORS将其搞砸了:有一个OPTION请求CORS来确定请求是否有效。浏览器F12工具并没有让它变得如此明显。有趣的是,我在调试器中收到了OPTION请求(这就是为什么我认为它有效),但我终于通过Fiddler发现在这些请求中没有正确传输contentType标头 - 而且'为什么模型没有正确绑定。