如何使用 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 调用中,您仅传递 ID
和 Estado
。更有可能(如果您正在使用 asp.net 验证)您有 400 个响应,因为您的 ajax 请求正文中缺少必需的属性。尝试添加缺少的属性 data: JSON.stringify({ Id: idmarcador, Estado: novoEstado, string: latitude, string: longitude })
我正在尝试更新数据库中名为“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 调用中,您仅传递 ID
和 Estado
。更有可能(如果您正在使用 asp.net 验证)您有 400 个响应,因为您的 ajax 请求正文中缺少必需的属性。尝试添加缺少的属性 data: JSON.stringify({ Id: idmarcador, Estado: novoEstado, string: latitude, string: longitude })