WebApi参数不为null但具有空值

时间:2014-01-24 05:29:32

标签: c# jquery asp.net knockout.js asp.net-web-api

这是添加了[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。 当我把所需的后退时,它会重新开始工作,但出现上述错误。

1 个答案:

答案 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)