繁体   English   中英

如何使用 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!")
            }
        });
}

这是我的 model:

        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”,并且效果很好。 我不知道为什么会这样。 “纬度”和“Estado”都是相同的类型 - 字符串。 有人可以看到错误吗? 这是我的 output 选项卡中显示的内容:

在此处输入图像描述

这是网络分析: 在此处输入图像描述

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

如果您还添加了 ajax http 请求 + 响应日志(状态和有效负载),则更容易理解问题。 但是,应用程序 output 对您的 API 方法调用说 400 bad request。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM