Я хочу использовать метод PUT, чтобы обновить переменную в моей базе данных. Мне нужно обновлять эту переменную каждый раз, когда нажимается кнопка - PullRequest
0 голосов
/ 04 февраля 2020

В моем 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();
    }

1 Ответ

0 голосов
/ 05 февраля 2020

Во-первых, вы должны подтвердить, что ${id} в URL заполнено, поскольку для действия PUT требуется id в маршруте. И вы пропустили contentType в ajax, установите значение application/json; charset=utf-8 при передаче строки json:

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; }
}
...