编辑 : 31/10/2017
相同的代码/方法也适用于 Asp.Net Core 2.0。主要区别在于,在 asp.net 内核中,Web API 控制器和 Mvc 控制器都合并为单个控制器模型。因此,您的返回类型可能是或它的实现之一(例如:IActionResult
OkObjectResult
)
用
contentType:"application/json"
您需要在发送时使用方法将其转换为JSON字符串,JSON.stringify
模型绑定器会将 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 操作方法参数,如下所示
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 MVC 6 是最新的稳定版本,在 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 :)
});
模型绑定适用于某些属性,但不是全部!为什么?
如果不使用属性修饰 Web API 方法参数[FromBody]
[HttpPost]
public CreateUserViewModel Save(CreateUserViewModel m)
{
return m;
}
并在不指定 contentType 属性值的情况下发送模型(原始 javascript 对象,而不是 JSON 格式)
$.ajax({
type: "POST",
data: model,
url: "../product/save"
}).done(function (res) {
console.log('res', res);
});
模型绑定将适用于模型上的平面属性,而不是类型为复杂/另一种类型的属性。在我们的例子中,属性将正确绑定到参数,但属性将是一个空列表。Id
Name
m
Tags
如果您使用的是简短版本,则会出现同样的问题,该版本在发送请求时将使用默认的内容类型。$.post
$.post("../product/save", model, function (res) {
//res contains the markup returned by the partial view
console.log('res', res);
});