2010-08-20 38 views
12

tôi sử dụng $ .ajax() để thăm dò ý kiến ​​một phương pháp hành động mỗi 5 giây như sau:

$.ajax({ 
    type: 'GET', url: '/MyController/IsReady/1', 
    dataType: 'json', success: function (xhr_data) { 
     if (xhr_data.active == 'pending') { 
      setTimeout(function() { ajaxRequest(); }, 5000);     
     } 
    } 
}); 

và hành động ActionResult:

public ActionResult IsReady(int id) 
{ 
    if(true) 
    { 
     return RedirectToAction("AnotherAction"); 
    } 
    return Json("pending"); 
} 

tôi đã phải thay đổi các loại hành động trở lại ActionResult trong để sử dụng RedirectToAction (ban đầu nó là JsonResult và tôi đã trở về Json(new { active = 'active' };), nhưng có vẻ như gặp khó khăn khi chuyển hướng và hiển thị Chế độ xem mới từ trong hàm gọi lại thành công $ .ajax(). Tôi cần phải chuyển hướng đến "AnotherAction" từ trong vòng này postback ajax bỏ phiếu. Phản hồi của Firebug là View từ "AnotherAction", nhưng nó không hiển thị.

Trả lời

15

Bạn cần tiêu thụ kết quả của yêu cầu ajax và sử dụng kết quả đó để chạy javascript để tự cập nhật window.location. Ví dụ: một cái gì đó như:

// Your ajax callback: 
function(result) { 
    if (result.redirectUrl != null) { 
     window.location = result.redirectUrl; 
    } 
} 

Trường hợp "kết quả" là đối số được truyền cho bạn bằng phương pháp ajax của jQuery sau khi hoàn thành yêu cầu ajax. (Và để tự tạo URL, hãy sử dụng UrlHelper.GenerateUrl, là trình trợ giúp MVC tạo URL dựa trên hành động/bộ điều khiển/v.v.)

+0

tìm thấy một cái gì đó tương tự về bài đăng khác sau khi tìm kiếm đầy đủ. khác biệt duy nhất là nó được sử dụng window.location.replace thay thế. cảm ơn! –

2

Tôi biết đây là một bài viết cũ nhưng sau khi tẩy trang web, đây vẫn là câu trả lời hàng đầu trên Google và tôi đã sử dụng một giải pháp khác. Nếu bạn muốn sử dụng RedirectToAction thuần túy, nó cũng hoạt động. Phản hồi RedirectToAction chứa đánh dấu hoàn chỉnh cho khung nhìn.

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); 
     } 
    } 
}); 
0

C# làm việc tốt

Tôi chỉ thay đổi JS vì responseText đã không làm việc cho tôi:

$.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); 
     } 
    }); 
0

Bạn có thể sử dụng Html.RenderAction helper trong một Xem:

public ActionResult IsReady(int id) 
{ 
    if(true) 
    { 
     ViewBag.Action = "AnotherAction"; 
     return PartialView("_AjaxRedirect"); 
    } 
    return Json("pending"); 
} 

Và trong "_AjaxRedirect" xem phần:

@{ 
    string action = ViewBag.ActionName; 
    Html.RenderAction(action); 
} 

tham khảo: https://stackoverflow.com/a/49137153/150342

Các vấn đề liên quan