常常有朋友遇到webapi参数传递问题,本身也碰到过一些坑,在此记录下正确的姿式,简单参数传递相信没有人会有问题,容易出现问题的是对象参数和表单参数。javascript
控制器代码以下:java
public class ValuesController : ApiController { // POST api/values [HttpPost] [Route("~/api/Values/Post")] public UserModel Post(UserModel value) { return value; } [HttpPost] [Route("~/api/Values/Put")] // PUT api/values/5 public UserModel Put([FromBody]UserModel value) { return value; } } public class UserModel { public string UserName { get; set; } public string Password { get; set; } }
对应的JS请求代码以下,对于有FromBody的Put请求来讲,两种请求方式都是能够的:web
<script type="text/javascript"> $(function () { $('#btnPost').click(function () { $.ajax({ url: '/api/Values/Post', data: { UserName: 'Admin', Password: '123456' }, method: 'POST', dataType: 'json' }).done(function (result) { $('#txtPost').val(JSON.stringify(result)); }) }) $('#btnPostFromBody').click(function () { $.ajax({ url: '/api/Values/Put', data: { UserName: 'Admin', Password: '123456' }, method: 'POST', dataType: 'json' }).done(function (result) { $('#txtPostFromBody').val(JSON.stringify(result)); }) $.ajax({ url: '/api/Values/Put', data: JSON.stringify({ UserName: 'Admin', Password: '123456' }), method: 'POST', dataType: 'json', contentType: 'application/json' }).done(function (result) { $('#txtPostFromBody').val(JSON.stringify(result)); }) }) })
有图有真相ajax
服务端代码以下:json
public class ValuesController : Controller { // POST api/values [HttpPost] [Route("~/api/Values/Post")] public UserModel Post(UserModel value) { return value; } [HttpPost] [Route("~/api/Values/Put")] // PUT api/values/5 public UserModel Put([FromBody]UserModel value) { return value; } } public class UserModel { public string UserName { get; set; } public string Password { get; set; } }
js请求代码有所不一样,FromBody再也不提供兼容支持 只能采用application/json方式提交:api
$('#btnPost').click(function () { $.ajax({ url: '/api/Values/Post', data: { UserName: 'Admin', Password: '123456' }, method: 'POST', dataType: 'json' }).done(function (result) { $('#txtPost').val(JSON.stringify(result)); }) }) $('#btnPostFromBody').click(function () { $.ajax({ url: '/api/Values/Put', data: JSON.stringify({ UserName: 'Admin', Password: '123456' }), method: 'POST', dataType: 'json', contentType: 'application/json' }).done(function (result) { $('#txtPostFromBody').val(JSON.stringify(result)); }) })
调用结果:服务器
有时候不免有上传文件的需求,对象存储这个嘛有的时候客户不肯意多花钱或者把文件存到别人的服务器上,只能本身存了。为了少点垃圾文件仍是和表单一块儿提交吧。app
控制器代码:url
js请求代码,注意红字:spa
$('#btnFromForm').click(function () { var data = new FormData(); data.append('UserName', 'Admin'); data.append('Password', '123456'); data.append('Photo', document.getElementById('txtPhoto').files[0]); $.ajax({ url: '/api/Values/RegisterUser', data: data, method: 'POST', dataType: 'json', contentType: false, processData: false }).done(function (result) { $('#txtFromForm').val(JSON.stringify(result)); }) })
请求结果:
最后说一句:接口的参数若是是对象,参数名必定不能与改对象的属性名相同(不区分大小写),不然属性的值会所有为null,我猜是微软认为有循环依赖了。好比以上例子中,UserModel中含有UserName,Password,Photo属性,则接口中UserModel参数的名字必定不能是UserName,Password,Photo(不区分大小写),曾经被这个问题坑了2天。