2013-04-21 3 views
4

좀 복잡해졌지만 왜 작동하지 않는지 알 수 없습니다. 내 Index.cshtml에 JSTree가 있습니다. 노드를 선택하면 Ajax 호출을 부분 뷰를 반환하는MVC 4.0에서 RedirectToAction은 PartialView를 Partial로 렌더링하지 않으며 전체 페이지를 전송합니다.

public async Task<ActionResult> GetEBooksItems(string id) 

으로 호출합니다. 이것은 완벽하게 작동합니다.

이제 트리 검색 외에도 검색 범위를 좁히기위한 몇 가지 기준을 추가하는 형식이 있습니다. Ajax.BeginForm을 사용하여 데이터를 컨트롤러에 다시 게시합니다.

 public async Task<ActionResult> GetEBooksCustom(GenericSearchViewModel filter) 
    {    
     vm = filter; 
     //Session["GenreNodeId"] = id; 
     Session["SearchCondition"] = (string.IsNullOrEmpty(vm.Condition) != true) ? vm.Condition : "All"; 
     Session["MaximumPrice"] = (string.IsNullOrEmpty(vm.MaxPrice) != true) ? vm.MaxPrice : "999999"; 
     Session["MinimumPrice"] = (string.IsNullOrEmpty(vm.MinPrice) != true) ? vm.MinPrice : "0"; 
     Session["SearchIndex"] = (string.IsNullOrEmpty(vm.SearchIndex) != true) ? vm.SearchIndex : "KindleStore"; 
     Session["SortOrder"] = (string.IsNullOrEmpty(vm.SortOrder) != true) ? vm.SortOrder : "price"; 
     Session["KeyWords"] = (string.IsNullOrEmpty(vm.Keywords) != true) ? vm.Keywords : ""; 
     Session["Title"] = (string.IsNullOrEmpty(vm.Title) != true) ? vm.Title : ""; 
     Session["Author"] = (string.IsNullOrEmpty(vm.Author) != true) ? vm.Author : ""; 
     return RedirectToAction("GetEBooksItems", new { id = vm.CategoryNodeId });          
    } 

이 메서드는 첫 번째 호출을 RedirectToAction으로 호출합니다.

제가 생각할 수있는 모든 것을 시도해 왔으며, 첫 번째 방법과 같이 부분보기 대신 항상 결과를 전체 페이지로 가져 왔습니다.

GetEBooksCustom에 대한 호출이 Ajax 호출로 "보이지"않는 것처럼 보입니다. 무엇이 놓칠까요? 도와 주셔서 감사합니다. Bernard.

** * *편집 6 시간 후에* ** * ** * ** *

사이에서 내가 무슨 짓 RedirectToAction을 사용하는 대신 PartialView를 직접 반환 할 수 있도록 "GetEBooksItems"에서 기능을 추출하는 것이 좋습니다. 디버거에서는 모든 것이 완벽하게 보입니다. 서버에서 200 응답을 볼 수 있지만 전체 페이지 디스플레이가 표시되고 url에는 컨트롤러 메서드가 표시되지만 Ajax 호출의 경우에는 그렇지 않습니다.

사실 나는 기본적으로 다른 곳의 동일한 양식을 사용하여 예상대로 작동합니다. 다른 것이 무엇인지 알 수 없습니까 ???

언제나처럼, 당신의 도움과 제안에 감사드립니다. Bernard

답변

0

나는이에 시간을 잃어버린 후. 대신 Ajax.BeginForm의 jQuery Form plugin를 사용하여 종료, 예상대로 정확히 작동하려면 약 10 분이 걸렸습니다!관심을 가질만한 사람들을 위해

, 여기에 위에 다른 하나를 코딩의 2 유형 :

//using (Ajax.BeginForm("GetEBooksCustom", "Home", new AjaxOptions { 
    //       UpdateTargetId = "ListOfBooksHere", 
    //       HttpMethod = "POST",          
    //       OnBegin="ShowProcessingMsg", 
    //       OnComplete="HideProcessingMsg" 


    $("#eBooksForm").ajaxForm({ 
     url: "/home/GetEBooksCustom", 
     type: "POST", 
     success: function(data) { 
      $("#ListOfBooksHere").html(data); 
     } 
    }); 

I이 사용하고 나는이 OnBegin 및 onComplete를 신경 쓰지 않았다

$(document).ajaxSend(function() { 
     $('.loadingIndicator').show(); 
    }); 

    $(document).ajaxComplete(function() { 
     $('.loadingIndicator').hide(); 
    }); 
0

RedirectToAction이 브라우저에 302를 반환하기 때문에 문자 그대로 다른 작업으로 리디렉션한다고 생각합니다. 브라우저가 전체 페이지를 리디렉션하여이를 처리합니다. GetEBooksItems의 논리로, 추상 또는 더 나은 아직

return GetEBooksItems(vm.CategoryNodeId); 

: 당신은합니다 (GetEBooksItems 방법의 내용에 다소 의존한다, 단순히 다른 메소드를 호출하는 대신 직접 리디렉션을 사용하여이 문제를 해결받을 수 별도의 방법은 GetEBooksCustom에 재사용하고 PartialView 직접. 당신이하지 않아도 그런 식으로 전혀 리디렉션 해결로 돌아갑니다.

+0

네, 그 점에 대해 조금 더 생각한 후에 생각했습니다. "vm"의 주요 부분을 반환하는 메서드가 필요하므로 RedirectTo 동작 대신 partialView와 함께 반환 할 수 있습니다. 고맙습니다! 때로는 묻고 두 번째 눈 켤레 만 있으면 대답을 얻을 수 있습니다. :-) – BernardG