jquery - 即使数据变量显示正确的值,jQuery Ajax GET 调用在成功后也不会刷新 html 页面上的数据
问题描述
我使用与下拉项对应的值,并根据该值在控制器中执行特定操作。使用 jQuery ajax GET 调用来调用控制器函数。控制器函数正确计算并填充列表,然后在视图中检索该列表。我已经验证,根据参数值(0、1 或 2),控制器会正确填充 vm.SomeList 中的数据。然而,非常令人费解的是,一旦控制器调用了 View,代码 Model.SomeList 的值是绝对正确的。但是,显示的数据永远不会改变,即使我不需要刷新页面来显示数据,我也尝试调用 location.reload(true)。我可能不理解 jQuery 调用是如何工作的。我对此进行了广泛的研究,但仍然无法弄清楚这个问题。尤其,viewmodel 列表参数始终具有正确的数据,具体取决于我选择的选项。我绝对可以在没有 ajax 的情况下完成这项工作,但现在我很好奇。任何指针(包括不理解基本 jQuery 的告诫)都将受到欢迎
控制器:
public ActionResult FuncA(string param)
{
var vm = new SomeViewModel();
....
....
try
{
// update a variable in view model...
vm.someList = GetList(param);
return View(vm);
}
catch (Exception e)
{
// no exception thrown (I verified this)
}
}
查看 (.cshtml) @Html.EnumDropDownListFor(m => m.routed, "路由到", new { @class = "col-sm-2 form-control"})
... @if (Model.SomeList.Any())
{
foreach (var item in Model.SomeList)
{
<tr>
<!-- display the list items -->
...
</tr>
}
}
</tbody>
jQuery 调用:
<script type="text/javascript">
$(document).ready(function () {
...
$('#filter').click(
function () {
alert("Reached 1");
$.ajax({
url: '@Url.Action("FuncA", "Home")',
type: 'GET',
data: {
param: $('#routed').val()
},
dataType: 'text',
cache: false,
success: function (response) {
alert("Reached 2");
if (response != null) {
alert("Reached 3");
location.reload(true);
}
else {
alert("null response");
}
return false;
},
error: function () {
alert("Error!")
}
})
}
)
});
解决方案
考虑以下。
$(function() {
$('#filter').click(function(e) {
e.preventDefault();
console.log("Filter Click - Event Triggered.");
$.ajax({
url: '@Url.Action("FuncA", "Home")',
type: 'GET',
data: {
param: $('#routed').val()
},
dataType: 'text',
cache: false,
success: function(response) {
console.log("AJAX Success", response);
if (response != null) {
console.log("AJAX Payload Not NULL");
location.href = location.href + "?" + Date.now();
} else {
console.log("AJAX Payload is empty.");
}
},
error: function(x, e, t) {
console.log("AJAX Error", e, t);
}
});
});
});
这有点清理干净,应该在控制台中提供更多详细信息以进行测试。
使用click
事件,我们可以使用.preventDefault()
. 如果失败了,什么都不会发生。如果成功,无论如何都会刷新页面。
location.reload(true);
这应该可以重新加载页面而不是缓存。如果没有,请尝试使用一些额外的查询将位置设置回自身。
location.href = location.href + "?" + Date.now();
这应该确保浏览器不会加载缓存版本。
推荐阅读
- python - tokenizer.max len 在这个类定义中做了什么?
- r - 如何删除每组日期匹配的数据行
- android - 如何以纵向将 YUV_420_888 保存为 JPEG?
- rust - 如何返回对迭代器中字段的引用?
- ingress-nginx - kubernetes ingress-nginx可以添加多少个路径定义?
- ubuntu - 无法通过代理服务器在 Ubuntu 18.04 上的 wget 上建立 SSL 连接
- html - 如何根据html中的变量返回值设置样式
- c++ - 将二维数组传递给函数而不使用向量
- python - For循环仅打印出Python中的最后一个元素
- java - Java 泛型类型非静态方法返回 Object 而不是泛型类型 T