В моем проекте 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" });
}
}
о чем сообщает ваш console.info("AJAX Success: ", result);
?
использование ajax позволяет удалить DOM при успешном обратном вызове или вызвать метод перезагрузки, как вы это делаете.
@MarkSchultheiss результат в порядке
@TinyWang есть какой-нибудь совет?
поскольку HTML отображается на стороне сервера, я советую перезагрузить страницу вручную, как вы уже делаете. если мы вручную удалим целевой DOM, на вашей странице будет отсутствовать несколько элементов.
Ваше действие возвращает правильный код ответа (200) каждый раз, даже если ваш процесс был сломан. Вы должны вернуть Badrequest из исключения перехвата с таким сообщением return BadRequest(new { result = "плохой запрос"}) и ответ json (код 200) после завершения успешного действия, например: return Json(new { result = "Ok" }). Это помогает правильно ajax определить правильный результат действия запроса, а затем обработать результат с перезагрузкой страницы или показать всплывающее сообщение об ошибке операции.
@ISR BadRequest не появляется, когда я печатаю.
@Oğuzhan да, вам нужно изменить тип возвращаемого действия Action с JsonResult на IActionResult и вернуть его как return Ok(new JsonResult(new { result = "OK" })) и BadRequest(new { result = "Fail" });
Я подумал об этом и изменил тип возвращаемого значения ActionResult, но IActionResult все равно не появился. @ISR
@Oguzhan просто попробуйте настроить проверку успешного ответа на действие: function(response) { alert('OK'); }, ошибка: function(xhr) { alert('ERR'); }
Я решил проблему, используя window.location.href вместо location.reload().
Я сделал это довольно быстро и смоделировал часть 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>
ajax никогда не перезагружает страницу автоматически. При отправке стандартной формы необходимо перезагрузить страницу.