我有一个带有图像链接的网格(Infragistics JQuery网格)的视图(Index.cshtml)。如果用户单击此链接,将调用以下jquery函数:
function ConfirmSettingEnddateRemarkToYesterday(remarkID) {
//Some code...
//Call to action.
$.post("Home/SetEnddateRemarkToYesterday", { remarkID: remarkID }, function (result) {
//alert('Succes: ' + remarkID);
//window.location.reload();
//$('#remarksgrid').html(result);
});
}
注释掉你可以看到我自己的警报和2次刷新视图的尝试。 location.reload()有效,但对于浏览器来说基本上是太多了。 .html(result)在remarksgrid div中发布整个index.cshtml + Layout.cshtml double。所以这是不正确的。
这是它调用的动作(SetEnddateRemarkToY yesterday):
public ActionResult SetEnddateRemarkToYesterday(int remarkID) {
//Some logic to persist the change to DB.
return RedirectToAction("Index");
}
这是重定向到的行为:
[HttpGet]
public ActionResult Index() {
//Some code to retrieve updated remarks.
//Remarks is pseudo for List<Of Remark>
return View(Remarks);
}
如果我在成功的AJAX帖子之后没有执行window.location.reload,那么视图将永远不会重新加载。我是MVC的新手,但我确信有更好的方法可以做到这一点。我不是在理解一些基本的东西。也许正朝着正确的方向推进?提前谢谢。
答案 0 :(得分:18)
当您请求AJAX调用时,您应该使用其响应重定向
修改您的控制器以使用登陆网址返回JSONResult:
public ActionResult SetEnddateRemarkToYesterday(int remarkID) {
//Some logic to persist the change to DB.
var redirectUrl = new UrlHelper(Request.RequestContext).Action("Index", "Controller");
return Json(new { Url = redirectUrl });
}
JS Call:
$.post("Home/SetEnddateRemarkToYesterday", { remarkID: remarkID }, function (result) {
window.location.href = result.Url
});
答案 1 :(得分:4)
在Ajax发布后,您需要调用特定的Url .. 像这样.. window.location.href = Url
答案 2 :(得分:0)
使用 jQuery.post 时,会通过 .done 方法返回新页面
jQuery的
jQuery.post("Controller/Action", { d1: "test", d2: "test" })
.done(function (data) {
jQuery('#reload').html(data);
});
HTML
<body id="reload">
答案 3 :(得分:0)
对我来说这是有效的。首先,我在表单中创建了 id="reload",然后使用 Colin 提供的解决方案并使用 Ajax 将数据发送到控制器并刷新了我的表单。
这看起来是我的控制器:
[Authorize(Roles = "User")]
[HttpGet]
public IActionResult Action()
{
var model = _service.Get()...;
return View(model);
}
[Authorize(Roles = "User")]
[HttpPost]
public IActionResult Action(object someData)
{
var model = _service.Get()...;
return View(model);
}
查看:
<form id="reload" asp-action="Action" asp-controller="Controller" method="post">
.
.
.
</form>
Javascript 函数,在这个函数中我添加了这个块:
$.ajax({
url: "/Controller/Action",
type: 'POST',
data: {
__RequestVerificationToken: token, // if you are using identity User
someData: someData
},
success: function (data) {
console.log("Success")
console.log(data);
var parser = new DOMParser();
var htmlDoc = parser.parseFromString(data, 'text/html'); // parse result (type string format HTML)
console.log(htmlDoc);
var form = htmlDoc.getElementById('reload'); // get my form to refresh
console.log(form);
jQuery('#reload').html(form); // refresh form
},
error: function (error) {
console.log("error is " + error);
}
});