2016-02-16 32 views
2

我想从jQuery发布到我的ASP.NET Core(RC1)API。当我通过HttpClient进行POST时,它工作正常,所以我认为这只是我错过的一件愚蠢的事情。ASP.NET Core:从jQuery发布复杂类型总是导致'null'model

我可以重现我的问题在香草默认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],返回一个模型,但从未填充性能。我也尝试了类似的问题的解决方案和解决方法,但我认为它们不适用于.NET Core或仅解决使用简单类型的问题。例如Web Api Parameter always nullusing jQuery post to ASP.Net webapihttp://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/

回答

4

我花了几个小时,直到我终于弄清楚了。正如我担心/希望,这只是一个愚蠢的事情:

花费了小费发现我有我的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是必需的,没有它modelbinding将无法正常工作。当然,我之前已经尝试过这个客户端代码,但是CORS加强了它:CORS有一个OPTION请求来确定请求是否有效。浏览器F12工具并没有像它应该那样明显。有趣的是,我在调试器中收到了OPTION请求(这就是为什么我认为它可行),但我终于通过Fiddler发现contentType头部在这些请求中没有正确传输 - 这就是为什么模型未被正确绑定的原因。