编辑:31/10/2017
相同的代码/方法也适用于Asp.Net Core 2.0。主要区别在于,在 asp.net core 中,web api 控制器和 Mvc 控制器合并在一起为单个控制器模型。所以,你的返回类型可能是IActionResult
或它的实现之一(例如:OkObjectResult
)
利用
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 操作方法参数,如下所示
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 :)
});
模型绑定适用于某些属性,但不是全部!为什么 ?
如果没有用[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);
});