编辑:31/10/2017
同样的代码/方法也适用于Asp。Net Core 2.0也是。主要的区别是,在asp.net核心中,web api控制器和Mvc控制器都被合并到一个控制器模型中。所以你的返回类型可能是IActionResult或者它的一个实现(例如:OkObjectResult)
Use
contentType:"application/json"
您需要使用JSON。stringify方法在发送时将其转换为JSON字符串,
模型绑定器会将json数据绑定到类对象。
下面的代码可以正常工作(已测试)
$(function () {
var customer = {contact_name :"Scott",company_name:"HP"};
$.ajax({
type: "POST",
data :JSON.stringify(customer),
url: "api/Customer",
contentType: "application/json"
});
});
结果
contentType属性告诉服务器我们将以JSON格式发送数据。因为我们发送了一个JSON数据结构,所以模型绑定将正常进行。
如果检查ajax请求的头部,可以看到Content-Type值被设置为application/json。
如果你没有明确指定contentType,它将使用默认的内容类型application/x-www-form-urlencoded;
2015年11月编辑,以解决评论中提出的其他可能的问题
发布一个复杂对象
假设你有一个复杂的视图模型类作为你的web api action方法参数
public class CreateUserViewModel
{
public int Id {set;get;}
public string Name {set;get;}
public List<TagViewModel> Tags {set;get;}
}
public class TagViewModel
{
public int Id {set;get;}
public string Code {set;get;}
}
你的web API的终点是
public class ProductController : Controller
{
[HttpPost]
public CreateUserViewModel Save([FromBody] CreateUserViewModel m)
{
// I am just returning the posted model as it is.
// You may do other stuff and return different response.
// Ex : missileService.LaunchMissile(m);
return m;
}
}
在写这篇文章的时候,ASP。NET MVC6是最新的稳定版本,在MVC6中,Web api控制器和MVC控制器都继承自Microsoft.AspNet.Mvc.Controller基类。
要从客户端向该方法发送数据,下面的代码应该可以正常工作
//Build an object which matches the structure of our view model class
var model = {
Name: "Shyju",
Id: 123,
Tags: [{ Id: 12, Code: "C" }, { Id: 33, Code: "Swift" }]
};
$.ajax({
type: "POST",
data: JSON.stringify(model),
url: "../product/save",
contentType: "application/json"
}).done(function(res) {
console.log('res', res);
// Do something with the result :)
});
模型绑定适用于某些属性,但不是所有属性!为什么?
如果你没有使用[FromBody]属性来修饰web api方法参数
[HttpPost]
public CreateUserViewModel Save(CreateUserViewModel m)
{
return m;
}
并发送模型(原始javascript对象,不是JSON格式)而不指定contentType属性值
$.ajax({
type: "POST",
data: model,
url: "../product/save"
}).done(function (res) {
console.log('res', res);
});
模型绑定将适用于模型上的平面属性,而不适用于复杂类型/其他类型的属性。在本例中,Id和Name属性将正确地绑定到参数m,但Tags属性将是一个空列表。
如果您使用的是短版本$,也会出现同样的问题。post在发送请求时将使用默认的Content-Type。
$.post("../product/save", model, function (res) {
//res contains the markup returned by the partial view
console.log('res', res);
});