如何使用 ajax 和 PUT 动词更新数据库?

How tu update database using ajax and the PUT verb?

我正在尝试更新数据库中名为“Estado”的 属性。我正在使用 ajax 来做到这一点,就像这样:

  function atualizaBD(idmarcador, novoEstado) {
    $.ajax
        ({
            url: `/api/IgnicoesAPI/${idmarcador}`,
            type: 'PUT',
            contentType: "application/json; charset=utf-8",
            dataType: 'json',
            data: JSON.stringify({ Id: idmarcador, Estado: novoEstado }),
            async: true,
            processData: false,
            cache: false,
            success: function (result) {
                 connection.invoke("PostMarker").catch(function (err) {
                              return console.error(err.toString());
                 });
            },
            error: function () {
                alert("ocorreu um erro!")
            }
        });
}

这是我的模型:

        public class Ignicoes
{

    public Ignicoes()
    {
        ListaOcorrencias = new HashSet<Ocorrencias>();

    }
    [Key]
    public int Id { get; set; }

    [Required]
    public string Latitude { get; set; }

    [Required]
    public string Longitude { get; set; }

    //estado(recusada, aceite, em avaliacao, concluido)
    //public string Estado { get; set; }
    [Required]
    public string Estado { get; set; }

  
    public DateTime DataInicioPropostaIgnicao { get; set; }
    public DateTime DataDecisaoIgnicao { get; set; }


    //lista de ocorrencias 
    public virtual ICollection<Ocorrencias> ListaOcorrencias { get; set; }

}

这是我的 PUT 方法:

     public async Task<IActionResult> PutIgnicoes([FromRoute] int id, [FromBody] Ignicoes ignicao)
    {
        
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }


        if (id != ignicao.Id)
        {
            return BadRequest();
        }

        else
        {
            var dataDecisao = DateTime.Now;
            var ig = _context.Ignicoes.FirstOrDefault(ignicaoId => ignicaoId.Id.Equals(id));
            if (ig != null)
            {
                ig.Estado = ignicao.Estado;
                //ig.Estado = 0;
                //ig.Latitude = ignicao.Latitude;
                //ig.Longitude = ignicao.Longitude;
                ig.DataDecisaoIgnicao = dataDecisao;
            }
            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!IgnicoesExists(id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }
        }

        return NoContent();
    }

我已经尝试过使用此代码,但我没有更改 属性“Estado”,而是更改了 属性“Latitude”并且它运行良好。我不知道为什么会这样。 “Latitude”和“Estado”都是同一类型 - 字符串。有人可以看到错误吗? 这是出现在我的输出选项卡中的内容:

网络分析如下:

{"errors":{"Latitude":["纬度字段是必需的。"],"Longitude":["经度字段是必需的。"]},"type":"https:/ /tools.ietf.org/html/rfc7231#section-6.5.1","title":"出现一个或多个验证错误。","status":400,"traceId":"|43114da6-4594b09a6260f1a2。 "}

如果您还添加了 ajax http 请求 + 响应日志(状态和有效负载),将更容易理解问题。但是,应用程序输出显示您的 API 方法调用有 400 个错误请求。

根据您的资源 class,您将三个属性声明为 [Required](Id 除外):Longitude, Latitude, Estado,但在您的 ajax 调用中,您仅传递 IDEstado。更有可能(如果您正在使用 asp.net 验证)您有 400 个响应,因为您的 ajax 请求正文中缺少必需的属性。尝试添加缺少的属性 data: JSON.stringify({ Id: idmarcador, Estado: novoEstado, string: latitude, string: longitude })