在我的Index.cshtm上,我有两个按钮,如果单击了这些按钮之一,我想更新数据库中的属性。例如,我有一个状态为“已接受”的标记,当我单击该标记的信息窗口时,我可以选择2种状态(“拒绝”,“其他”)。如果我按下按钮“拒绝”,则该标记的状态(以前是“接受”)在数据库上将变为“拒绝”。为此,我在客户端使用了PUT方法和ajax。但是,当我尝试更改标记的状态时,这给了我一个错误。这是客户端上的代码:
function atualizaBD(newState) {
$.ajax
({
url: `/api/IgnicoesAPI/${id}`,
type: 'PUT',
data: JSON.stringify({
State: newState
}),
success: function (result) {
alert('State Updated');
},
error: function () {
alert("Error")
}
});
}
这里是按钮之一的代码:
function denied() {
var conclued = L.icon({
iconUrl: ' https://cdn1.iconfinder.com/data/icons/modifiers-essential-glyph-1/48/Mod_Essentials-24-256.png',
iconSize: [35, 35]
});
if (clickedmarker) {
clickedmarker.setIcon(denied);
}
clickedmarker = null;
atualizaBD("denied");
connection.invoke("PostMarker").catch(function (err) {
return console.error(err.toString());
});
}
这是我的控制器的代码:
[HttpPut("{id}")]
public async Task<IActionResult> PutIgnicoes([FromRoute] int id, [FromBody] Ignicoes ignicao, string newState)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != ignicao.Id)
{
return BadRequest();
}
var decisionDate= DateTime.Now;
var ig = _context.Ignicoes.FirstOrDefault(ignicaoId => ignicaoId.Id.Equals(id));
ig.State= newState;
ig.Latitude = ignicao.Latitude;
ig.Longitude = ignicao.Longitude;
//esta data vai depender da avaliação de cada uma das ocorrencias
ig.DataInicioPropostaIgnicao = ignicao.DataInicioPropostaIgnicao;
ig.DataDecisaoIgnicao = decisionDate;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!IgnicoesExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
[第一件事是您应该确认url中的${id}
已填充,因为PUT操作需要route中的id
。而且您错过了ajax中的contentType
,如果传递json字符串,则将值设置为application/json; charset=utf-8
:
function atualizaBD(newState) {
$.ajax
({
url: `/api/IgnicoesAPI/5`, // pass {id}
type: 'PUT',
contentType: "application/json; charset=utf-8",
data: JSON.stringify({
State: newState
}),
success: function (result) {
alert('State Updated');
},
error: function () {
alert("Error")
}
});
}
并且在服务器端,如果要发送除State
之外的更多数据,则可以定义一个模型来接受从客户端发送的值,请使用[FromBody]
进行模型绑定:
[HttpPut("{id}")]
public void PutIgnicoes([FromRoute] int id, [FromBody]myValue myValue)
{
var state = myValue.State;
}
public class myValue {
public string State { get; set; }
}