我使用$ .ajax()每5秒轮询一次动作方法,如下所示:
$.ajax({
type: 'GET', url: '/MyController/IsReady/1',
dataType: 'json', success: function (xhr_data) {
if (xhr_data.active == 'pending') {
setTimeout(function () { ajaxRequest(); }, 5000);
}
}
});
和ActionResult操作:
public ActionResult IsReady(int id)
{
if(true)
{
return RedirectToAction("AnotherAction");
}
return Json("pending");
}
我必须将动作返回类型更改为ActionResult才能使用RedirectToAction(最初是JsonResult而我正在返回Json(new { active = 'active' };
),但它看起来很难重定向并从$中呈现新视图.ajax()成功回调。我需要从这个轮询ajax回发中重定向到“AnotherAction”。 Firebug的响应是来自“AnotherAction”的视图,但它没有渲染。
答案 0 :(得分:18)
您需要使用ajax请求的结果并使用它来运行javascript以手动更新window.location。例如,像:
// Your ajax callback:
function(result) {
if (result.redirectUrl != null) {
window.location = result.redirectUrl;
}
}
其中“result”是在完成ajax请求后由jQuery的ajax方法传递给您的参数。 (要生成URL本身,请使用UrlHelper.GenerateUrl
,这是一个基于actions / controllers /等创建URL的MVC帮助程序。)
答案 1 :(得分:4)
我知道这是一篇超级老的文章,但在网上搜索后,这仍然是谷歌的最佳答案,我最终使用了不同的解决方案。如果你想使用纯RedirectToAction,这也适用。 RedirectToAction响应包含视图的完整标记。
<强> C#:强>
return RedirectToAction("Action", "Controller", new { myRouteValue = foo});
<强> JS:强>
$.ajax({
type: "POST",
url: "./PostController/PostAction",
data: data,
contentType: "application/json; charset=utf-8",
dataType: "json",
complete: function (result) {
if (result.responseText) {
$('body').html(result.responseText);
}
}
});
答案 2 :(得分:2)
C#运作良好
我刚刚更改了JS,因为responseText对我不起作用:
$.ajax({
type: "POST",
url: posturl,
contentType: false,
processData: false,
async: false,
data: requestjson,
success: function(result) {
if (result) {
$('body').html(result);
}
},
error: function (xhr, status, p3, p4){
var err = "Error " + " " + status + " " + p3 + " " + p4;
if (xhr.responseText && xhr.responseText[0] == "{")
err = JSON.parse(xhr.responseText).Message;
console.log(err);
}
});
答案 3 :(得分:0)
您可以在视图中使用Html.RenderAction
帮助程序:
public ActionResult IsReady(int id)
{
if(true)
{
ViewBag.Action = "AnotherAction";
return PartialView("_AjaxRedirect");
}
return Json("pending");
}
在“_AjaxRedirect”局部视图中:
@{
string action = ViewBag.ActionName;
Html.RenderAction(action);
}