Asp.Net MVC中AJAX执行成功后页面无法自动刷新问题
问题:Asp.Net MVC中AJAX操作后页面无法自动刷新
在我的Asp.Net MVC项目中,我通过jQuery获取复选框的ID,用AJAX发送到控制器执行删除或恢复操作,方法能正常执行,但操作完成后页面不会自动刷新,必须手动刷新才能看到结果。
前端jQuery代码
function takeIds() { var selected = []; $('#checkDiv input[type="checkbox"]:checked').each(function () { selected.push($(this).attr('value')); }); var messageIds = selected.join(','); console.log("messageIds: ", messageIds); // 控制台查看messageIds $.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.log("AJAX Success: ", result); if (result === 'Ok') { location.reload() } else { alert('消息恢复操作失败。'); } }, error: function (jqXHR, textStatus, errorThrown) { console.error("AJAX Error: ", textStatus, errorThrown); alert('发生错误。'); } }); }
后端控制器代码
[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("将跳转至: DeletedMessages"); return Json(new { result = "Ok" }); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine("发生错误: " + ex.Message); return Json(new { result = "Fail" }); } }
问题根源与解决办法
核心问题
后端返回的是包含result属性的JSON对象({ result: "Ok" }),但前端判断条件写的是if (result === 'Ok'),直接把整个对象和字符串做比较,条件永远不成立,所以不会触发location.reload()。
修复方案1:修正前端判断逻辑
修改AJAX成功回调里的判断条件,正确访问返回对象的result属性:
success: function (result) { console.log("AJAX Success: ", result); if (result.result === 'Ok') { location.reload() } else { alert('消息恢复操作失败。'); } }
优化方案2:局部更新DOM(无需刷新整个页面)
如果不想刷新整个页面,可以直接操作DOM移除或更新已处理的消息元素,提升用户体验:
success: function (result) { console.log("AJAX Success: ", result); if (result.result === 'Ok') { // 移除选中的消息元素(假设消息元素带有data-id属性匹配复选框value) $('#checkDiv input[type="checkbox"]:checked').each(function () { var msgId = $(this).val(); $('.message-item[data-id="' + msgId + '"]').fadeOut(function(){ $(this).remove(); }); }); } else { alert('消息恢复操作失败。'); } }
内容的提问来源于stack exchange,提问作者Oğuzhan
相关产品推荐
相关产品推荐

