2010-08-20 3 views
12

나는 액션 방법을 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() success 콜백 내에서 새 View를 리디렉션하고 렌더링하는 데 문제가있는 것처럼 보입니다. 이 폴링 아약스 포스트 백에서 "AnotherAction"으로 리디렉션해야합니다. Firebug의 응답은 "AnotherAction"의보기이지만 렌더링이 아닙니다.

답변

15

ajax 요청의 결과를 소비하고 javascript를 사용하여 직접 window.location을 수동으로 업데이트해야합니다. 예를 들어, 뭔가 같은 :

"결과는"아약스 요청의 완료 후 jQuery의 아약스 방법으로 당신에 전달되는 인수입니다
// Your ajax callback: 
function(result) { 
    if (result.redirectUrl != null) { 
     window.location = result.redirectUrl; 
    } 
} 

. URL 자체를 생성하려면 UrlHelper.GenerateUrl을 사용하십시오. 이는 액션/컨트롤러/등을 기반으로 URL을 만드는 MVC 도우미입니다.

+0

다른 게시물에 비슷한 발견 철저한 검색 후. 차이점은 대신 window.location.replace를 사용한다는 것입니다. 감사! –

2

나는 이것이 매우 오래된 기사이지만 웹을 수색 한 후에도 여전히 Google에서 최상위 답변을 얻었으며 다른 솔루션을 사용하게되었습니다. 순수한 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); 
     } 
    } 
}); 
0

C#을에서 responseText 나를 위해 작동하지 않았기 때문에 난 그냥 JS 변경도

을했다 :

$.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

당신은보기에 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); 
} 

: https://stackoverflow.com/a/49137153/150342