Значение кнопки не меняется после первого нажатия

#c# #asp.net #asp.net-core

#c# #asp.net #asp.net-core

Вопрос:

У меня есть эта кнопка, которая изменяет логическое значение в базе данных после нажатия на нее. Если логическое PausedCMDBUpload = true значение, кнопка должна отображать UNPAUSE, если логическое значение равно false , оно должно отображать PAUSE.

Кнопка изменяет значение в базе данных, как и предполагалось, однако после первого нажатия кнопки страница обновится, но текст на кнопке останется прежним. После повторного нажатия текст изменится.

У кого-нибудь есть идея, почему значение на кнопке не меняется после первого щелчка? Любая помощь будет оценена!

Вид

 <script>
    function ClickButton1() {
        $.ajax({
            type: "POST",
            url: "@Url.Action("ClickButton1", "Devices")",
            async: true,
            success: function (msg) {
                ServiceSucceeded(msg);
            },
            error: function () {
                return "error";
            }
        });
    }
</script>

@if (@Model.ElementAt(0).PauseCMDBUpload == true)
    {
        <input id="Button1" type="button" value="UNPAUSE" onclick="ClickButton1(); document.location.reload(true)" />
    } 
    else
    {
        <input id="Button1" type="button" value="PAUSE" onclick="ClickButton1(); document.location.reload(true)" />
    }
 

Контроллер

 [HttpPost]
public void ClickButton1()
{
    var entity = db.Devices;

    foreach (var device in entity)
    {
        if (device.PauseCMDBUpload == false)
        {
            device.PauseCMDBUpload = true;
        }
        else
        {
            device.PauseCMDBUpload = false;
        }
    }
    db.SaveChanges();
}
 

Комментарии:

1. С чего бы это? Вы отправляете сообщение в действие, вызываемое ChancePauseCMDBUpload в контроллере Devices . Но вызывается единственное действие на стороне сервера, которое вы показываете ClickButton1 . Поэтому я полагаю, что где-то в процессе вы получаете ошибку 404 NotFound

2. Мой плохой, это какой-то старый код, который я использовал для тестирования. Я отредактировал свой вопрос.

3. Может быть проблема с синхронизацией. Ваш вызов ajax является асинхронным, поэтому вы вызываете reload до завершения вызова ajax…

4. Можно ли попробовать в формате …$(«Button1»).click(function(e) { e.preventDefault(); $.ajax({ type: «POST», url: «/ClickButton1/Devices/»

5. document.location.reload(true) вероятно, должно быть внутри success .

Ответ №1:

Вы можете изменить свой код следующим образом:

 <script>
    function ClickButton1() {
        $.ajax({
            type: "POST",
            url: "@Url.Action("ClickButton1", "Devices")",
            async: true,
            success: function (msg) {
                var btnText = $('#Button1').val();
                if (btnText == "UNPAUSE")
                  $('#Button1').val('PAUSE');
                else
                 $('#Button1').val('UNPAUSE');
                ServiceSucceeded(msg);
            },
            error: function () {
                return "error";
            }
        });
    }
</script>

@if (@Model.ElementAt(0).PauseCMDBUpload == true)
    {
        <input id="Button1" type="button" value="UNPAUSE" onclick="ClickButton1();" />
    } 
    else
    {
        <input id="Button1" type="button" value="PAUSE" onclick="ClickButton1();" />
    }