У меня есть типы входных данных для флажка, и когда я выполняю методы удаления или получения, он работает, но страница не перезагружается

В моем проекте Asp.Net Mvc у меня есть входные данные типа флажка, и я получаю через них идентификаторы элементов с помощью jquery и отправляю их контроллеру с помощью ajax. Методы работают, но после работы страница не перезагружается, поэтому я вижу результат только при перезагрузке страницы вручную.

function takeIds() {
    var selected = [];
    $('#checkDiv input[type = "checkbox"]:checked').each(function () {
        selected.push($(this).attr('value'));
    });

    var messageIds = selected.join(',');
    console.info("messageIds: ", messageIds); // Konsolda messageIds'yi kontrol etmek için

    $.ajax({
        url: '@Url.Action("RetrieveMessage", "WriterPanelMessage")',
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        data: JSON.stringify({ messageIds: messageIds }),
        timeout: 10000,
        success: function (result) {
            console.info("AJAX Success: ", result);
            if (result === 'Ok') {
                location.reload()
            } else {
                alert('Mesaj geri alma işlemi başarısız oldu.');
            }
        },
        error: function (jqXHR, textStatus, errorThrown) {
            console.error("AJAX Error: ", textStatus, errorThrown);
            alert('Bir hata oluştu.');
        }
    });
}
   [HttpPost]
   public async Task<JsonResult> RetrieveMessage(string messageIds)
   {
       try
       {
           string p = (string)Session["WriterMail"];
           string[] Ids = messageIds.Split(',');
           List<Message> messages = messageManager.GetListInbox(p);

           if (!string.IsNullOrEmpty(messageIds) && Ids.Length > 0)
           {
               foreach (var item in messages)
               {
                   foreach (var id in Ids)
                   {
                       if (item.MessageID == Convert.ToInt32(id))
                       {
                           item.IsDeleted = false;
                           await messageManager.Update(item);
                       }
                   }
               }
           }

           System.Diagnostics.Debug.WriteLine("Yönlendirme yapılacak: DeletedMessages");
           return Json(new { result = "Ok" });
       }
       catch (Exception ex)
       {
           System.Diagnostics.Debug.WriteLine("Hata oluştu: " + ex.Message);
           return Json(new { result = "Fail" });
       }
   }

ajax никогда не перезагружает страницу автоматически. При отправке стандартной формы необходимо перезагрузить страницу.

mykaf 21.05.2024 21:09

о чем сообщает ваш console.info("AJAX Success: ", result);?

Mark Schultheiss 21.05.2024 23:30

использование ajax позволяет удалить DOM при успешном обратном вызове или вызвать метод перезагрузки, как вы это делаете.

Tiny Wang 22.05.2024 04:48

@MarkSchultheiss результат в порядке

Oğuzhan 22.05.2024 05:56

@TinyWang есть какой-нибудь совет?

Oğuzhan 22.05.2024 05:59

поскольку HTML отображается на стороне сервера, я советую перезагрузить страницу вручную, как вы уже делаете. если мы вручную удалим целевой DOM, на вашей странице будет отсутствовать несколько элементов.

Tiny Wang 22.05.2024 06:06

Ваше действие возвращает правильный код ответа (200) каждый раз, даже если ваш процесс был сломан. Вы должны вернуть Badrequest из исключения перехвата с таким сообщением return BadRequest(new { result = "плохой запрос"}) и ответ json (код 200) после завершения успешного действия, например: return Json(new { result = "Ok" }). Это помогает правильно ajax определить правильный результат действия запроса, а затем обработать результат с перезагрузкой страницы или показать всплывающее сообщение об ошибке операции.

ISR 22.05.2024 06:37

@ISR BadRequest не появляется, когда я печатаю.

Oğuzhan 22.05.2024 09:46

@Oğuzhan да, вам нужно изменить тип возвращаемого действия Action с JsonResult на IActionResult и вернуть его как return Ok(new JsonResult(new { result = "OK" })) и BadRequest(new { result = "Fail" });

ISR 22.05.2024 10:10

Я подумал об этом и изменил тип возвращаемого значения ActionResult, но IActionResult все равно не появился. @ISR

Oğuzhan 22.05.2024 10:19

@Oguzhan просто попробуйте настроить проверку успешного ответа на действие: function(response) { alert('OK'); }, ошибка: function(xhr) { alert('ERR'); }

ISR 22.05.2024 10:26

Я решил проблему, используя window.location.href вместо location.reload().

Oğuzhan 22.05.2024 13:58
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
12
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я сделал это довольно быстро и смоделировал часть ajax, просто чтобы показать действие (после небольшой задержки появляется пустой экран), если вы отметите что-то для публикации.

Вот некоторые подробности рассматриваемой проблемы.

Методы экземпляра

  • window.location.reload(); Это метод экземпляра, который перезагрузит текущий URL-адрес — как кнопка «Обновить» в браузере; Перезагружается с данными POST, тогда как .href нет. Ссылка: https://developer.mozilla.org/en-US/docs/Web/API/Location/reload

  • window.location.replace(url); Заменяет текущий ресурс предоставленным обязательным URL-адресом — пользователь не сможет использовать кнопку НАЗАД, чтобы вернуться к текущему URL-адресу, поскольку URL-адрес не будет в истории сеанса. Ссылка: https://developer.mozilla.org/en-US/docs/Web/API/Location/replace

Свойства экземпляра:

  • window.location.href = url; «строковый идентификатор», который возвращает URL-адрес в виде строки или позволяет обновлять href. Основное отличие от .href и .replace() заключается в том, что href хранится в истории сеанса, что означает, что пользователь может вернуться назад с помощью кнопки НАЗАД в браузере. Ссылка: https://developer.mozilla.org/en-US/docs/Web/API/Location/href Особое примечание: .href не будет перезагружаться, если в URL-адресе есть хэш-свойство Ссылка: https ://developer.mozilla.org/en-US/docs/Web/API/Location/hash

ТАК, учитывая всю эту информацию ^^, предлагаю использовать window.location.href = window.location.href;

function takeIds(event) {
  const container = $(this).closest('.message-container');
  const checks = container
    .find('input[type = "checkbox"]')
    .filter(':checked');
  let info = `<div>${container.data("postaddress")}</div><div>${( !checks.length ? "Nothing checked!" :
    `Good: ${checks.length} checked!`)}</div>`;
  $('.information')
    .toggleClass('error', !checks.length)
    .html(info);

  if (!checks.length) {
    return;
  }
  // could do this or the map only
  //let selected = [];
  //checks.each(function() {
  //   selected.push($(this).val());
  //});
  let selected = checks.map((i, ck) => ck.value).toArray();
  let messageIds = selected;
  $('.information')
    .toggleClass('error', false)
    .html($('.information').html() + `[${messageIds}]`);
  $.ajax({
    url: container.data("postaddress"),
    type: 'POST',
    dataType: 'json',
    data: messageIds,
    timeout: 10000
  }).done(function(result) {
    let msg = `<div>AJAX Success:${JSON.stringify(result)}</div>`;
    if (result.ok) {
      msg = msg + "<div class='error'>We are good here we will reload shortly...</div>";
      setTimeout(() => {
        window.location.href = window.location.href;
      }, 5000);

    } else {
      msg = msg + '<div>Mesaj geri alma işlemi başarısız oldu. Woops</div>';
      // alert('Mesaj geri alma işlemi başarısız oldu.');
    }
    $('.information')
      .toggleClass('error', false)
      .html($('.information').html() + msg);
  }).fail(function(jqXHR, textStatus, errorThrown) {
    let msg = `<div>AJAX Error:${textStatus}Error:${errorThrown}</div>`;
    $('.information')
      .toggleClass('error', true)
      .html($('.information').html() + msg);
    // alert('Bir hata oluştu.');
  });
}
$('.message-container').on('click', '.testerout', takeIds);

/* below here is my fake ajax mock 
  I did not invent this. Leveraged some info from here https://stackoverflow.com/q/5272698/125981 */
function mockAjax(options) {
  var that = {
    done: function done(callback) {
      if (options.success)
        setTimeout(callback, options.timeout, options.response);
      return that;
    },
    fail: function error(callback) {
      if (!options.success)
        setTimeout(callback, options.timeout, options.response);
      return that;
    }
  };
  return that;
}
/* Then override api call without touching $.ajax: */
WriterPanelMessage = function() {
  return mockAjax({
    success: true,
    timeout: 500,
    response: {
      results: {
        result: 'Ok'
      }
    }
  });
};
/* Then override api call without touching $.ajax: */
WriterPanelMessage = function() {
  return mockAjax({
    success: false,
    timeout: 500,
    response: {
      results: {
        result: 'Oh No'
      }
    }
  });
};

$.ajax = function() {
  return mockAjax({
    success: true,
    response: {
      ok: true
    },
    timeout: 500
  });
};
body {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
  font-size: 16px;
  display: grid;
  place-items: center;
  gap: 0.5em;
}

.message-container,
.information {
  display: grid;
  grid-template-columns: 1fr;
  grid-template-rows: 2em;
  align-items: center;
  gap: 0.5em;
  justify-content: center;
  border: solid 1px #00FF00;
  background-color: #00FF0040;
  border-radius: 1em;
  padding: 0.5em;
}

.message-container .testerout {
  border-radius: 2em;
  padding: 0.5em;
}

.information>* {
  border-bottom: 1px solid;
}

.information.error,
.information .error {
  border: solid 1px #FF0000;
  background-color: #FF000010;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<!-- actual <div id = "checkDiv" class = "message-container" data-postaddress = "@Url.Action("RetrieveMessage", "WriterPanelMessage")">-->
<div id = "checkDiv" class = "message-container" data-postaddress = "WriterPanelMessage\RetrieveMessage">
  <label><input type = "checkbox" value = "cheers"/>Cheers</label>
  <label><input type = "checkbox" value = "speech"/>Speeches</label>
  <label><input type = "checkbox" value = "yells"/>Yells</label>
  <label><input type = "checkbox" value = "whisper"/>Whisper</label>
  <label><input type = "checkbox" value = "quiet"/>Silence</label>
  <button class = "testerout" type = "button">Test Our Code</button>
</div>
<div class = "information"></div>

Другие вопросы по теме