这是添加了[FromBody]属性的默认webapi方法:
// PUT api/Pedidos/5
public async Task<IHttpActionResult> PutPedido(Guid id,[FromBody]Job pedido)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != pedido.Id)
{
return BadRequest();
}
db.Entry(pedido).State = EntityState.Modified;
try
{
await db.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!PedidoExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return StatusCode(HttpStatusCode.NoContent);
}
这是jquery请求:
self.update = function () {
$.ajax({
type: "PUT",
url: baseUri + '@Model.Id',
data: ko.toJSON(updatableData),
dataType: "json",
contentType: "application/json"
})
.done(function (data) {
alert('Magic');
})
.error(function (jqXHR, textStatus, errorThrown) {
alert(errorThrown);
alert("fail");
});
}
这是数据:
var updatableData = {
Id : '@Model.Id',
Name : '@Model.Name',
AbreviaNome: self.AbreviaNome(),
AbreviaFantasia: self.AbreviaFantasia,
AbreviaLogradouro: self.AbreviaLogradouro,
AbreviaComplemento: self.AbreviaComplemento,
AbreviaBairro: self.AbreviaBairro,
AbreviaCidade: self.AbreviaCidade,
AbreviaExtra: self.AbreviaExtra,
};
这是部分c#模型,我删除了大约7个字段,其中2个是日期,其余是字符串:
public class Job
{
public Guid Id { get; set; }
[Required]
public string Name {get;set;}
public int TotalItems { get; set; }
public bool AbreviaNome { get; set; }
public bool AbreviaFantasia { get; set; }
public bool AbreviaLogradouro { get; set; }
public bool AbreviaComplemento { get; set; }
public bool AbreviaBairro { get; set; }
public bool AbreviaCidade { get; set; }
public bool AbreviaExtra { get; set; }
public virtual ICollection<Item> Items { get; set; }
}
我使用带有knockout.js的ASP.NET,这就是为什么你在数据上看到'self'的原因。请求来了,我得到了PUT方法就好了。但是pedido实例具有所有错误值并且根本没有Id(仅在第一个参数上),并且所有值都应该为真,除了最后一个,在我尝试的时候,请参阅Request Body内容:
{"Id":"c47f0ad2-0783-e311-8289-88532ee08d00", "Name":"Test 1","AbreviaNome":true,"AbreviaFantasia":true,"AbreviaLogradouro":true,"AbreviaComplemento":true,"AbreviaBairro":true,"AbreviaCidade":true,"AbreviaExtra":false}
这里可能会发生什么?我必须在“updatableData”对象上包含所有字段吗?还有另一种方法可以实现我的需求吗?
编辑: 我已经为缺少的模型添加了一个字段,但其重要的“名称”是一个必填字段,并且在某个地方有一个错误,它认为名称值不在请求上,实际上是在校正之后。
编辑: 在ModelBinding中发现了与必需名称相关的错误:
{"$id":"1","Message":"The request is invalid.","ModelState":{"$id":"2","pedido.Name":["The Name field is required."]}}
我已经从Name属性中删除了[Required]属性,然后它停止工作更糟,在ModelBinding中我只得到一个参数,即Id。 当我把所需的后退时,它会重新开始工作,但出现上述错误。
答案 0 :(得分:2)
尝试使用JSON.stringify
代替ko.ToJSON
:
self.update = function () {
$.ajax({
type: "PUT",
url: baseUri + '@Model.Id',
data: JSON.stringify(updatableData),
datatype: "json",
contenttype: "application/json"
})
.done(function (data) {
alert('Magic');
})
.error(function (jqXHR, textStatus, errorThrown) {
alert(errorThrown);
alert("fail");
});
}
此外,您似乎正在传递一个对象但期望有2个参数,因此您不需要方法签名上的Guid id
,因为它已经在Job
对象中:
public async Task<IHttpActionResult> PutPedido([FromBody]Job pedido)