2012-05-14 1 views
42

ASP.NET MVC에서 단일 페이지 아약스 응용 프로그램을 작성하고 있습니다. jQuery를 많이 사용하고 있습니다. 나는 응용 프로그램을 통해 다음과 유사한 일을 할 :ASP.NET MVC - PartialView를 다른 객체와 함께 Ajax로 반환

JS :

$.ajax({ 
    type: "GET", 
    url: "/Home/GetSomePartialView/", 
    data: someArguments, 
    success: function (viewHTML) { 
     $("#someDiv").html(viewHTML); 
    }, 
    error: function (errorData) { onError(errorData); } 
}); 

컨트롤러 C 번호 : 이것은 위대한 작품을

public ActionResult GetSomePartialView(SomeArgumentModel someArguments) 
{ 

    return PartialView("_CaseManager"); 
} 

합니다. viewHTML (ajax success 함수에서) 문자열로 반환되고 페이지에 아무런 문제가 없습니다.

이제 PartialView HTML 문자열뿐만 아니라 일종의 상태 표시기도 반환하고 싶습니다. 이것은 권한 항목입니다. 예를 들어, 권한이없는 앱의 일부를 얻으려고하면 누군가가 요청한 것과 다른 PartialView를 반환하고 팝업 창에 메시지를 표시하여 해당 사실을 알리고 싶습니다. 왜 그들은 View와 다른 관점을 얻었습니다.

그래서 -이 작업을 수행하기 위해, 나는 다음을 수행 싶습니다 :

컨트롤러 C 번호 :

public ActionResult GetSomePartialView(SomeArgumentModel someArguments) 
{ 
    ReturnArgs r = new ReturnArgs(); 

    bool isAllowed = CheckPermissions(); 

    if (isAllowed) 
    { 
     r.Status = 400; //good status ... proceed normally 
     r.View = PartialView("_CaseManager"); 
    } 
    else 
    { 
     r.Status = 300; //not good ... display permissions pop up 
     r.View = PartialView("_DefaultView"); 
    } 

    return Json(r); 
} 

public class ReturnArgs 
{ 
    public ReturnArgs() 
    { 
    } 

    public int Status { get; set; } 
    public PartialViewResult View { get; set; } 
} 

JS :

$.ajax({ 
    type: "GET", 
    url: "/Home/GetSomePartialView/", 
    data: someArguments, 
    success: function (jsReturnArgs) { 

     if (jsReturnArgs.Status === 300) { //300 is an arbitrary value I just made up right now 
      showPopup("You do not have access to that."); 
     } 

     $("#someDiv").html(jsReturnArgs.View); //the HTML I returned from the controller 
    }, 
    error: function (errorData) { onError(errorData); } 
}); 

그렇다고

잘 작동합니다. JavaScript에서 좋은 객체를 얻었지만 (속성의 전체 HTML 문자열을 얻는 방법을 알 수는 없습니다).

방금 ​​PartialView을 반환하는 경우 반환되는 동일한 문자열을 찾고 있습니다.

(처음 언급했듯이이 페이지는 단일 페이지 앱이므로 다른보기로 리디렉션 할 수는 없습니다.)

미리 도움을 청하십시오!

답변

40

그래서 다음과 같은 글을 사용하여 나는이 작업 있어요 :

C 번호 : 그들은 모두 멋지게 배치

Partial Views vs. Json (or both)

Render a view as a string

을 한 후 나는 다음에 내 코드를 변경 :

public ActionResult GetSomePartialView(SomeArgumentModel someArguments) 
{ 
    ReturnArgs r = new ReturnArgs(); 

    bool isAllowed = CheckPermissions(); 

    if (isAllowed) 
    { 
     r.Status = 400; //good status ... proceed normally 
     r.ViewString = this.RenderViewToString("_CaseManager"); 
    } 
    else 
    { 
     r.Status = 300; //not good ... display permissions pop up 
     r.ViewString = this.RenderViewToString("_DefaultView"); 
    } 

    return Json(r); 
} 

public class ReturnArgs 
{ 
    public ReturnArgs() 
    { 
    } 

    public int Status { get; set; } 
    public string ViewString { get; set; } 
} 

JS :

$.ajax({ 
    type: "GET", 
    url: "/Home/GetSomePartialView/", 
    data: someArguments, 
    success: function (jsReturnArgs) { 

     if (jsReturnArgs.Status === 300) { //300 is an arbitrary value I just made up right now 
      showPopup("You do not have access to that."); 
     } 

     $("#someDiv").html(jsReturnArgs.ViewString); //the HTML I returned from the controller 
    }, 
    error: function (errorData) { onError(errorData); } 
}); 
6

하나의 방법은 JSON은 항상 HTML을 보내는 것입니다으로 인코딩 된 여러 매개 변수와 JSON 및 HTML을 반환하는 것을 생략 할 수 있지만, 당신은 나처럼 뭔가에 설정된 상태가 숨겨진 필드를 보내 ..

success: function(data) 
{ 
    if(data.find("#ajax-status").val()==="success") 
    { 
    $("#someDiv").html(data); 
    } 
    else 
    { 
    showPopup("You do not have access to that."); 
    } 
} 

나는이 appraoch를 추천하지 않을 것이다 나는 정상적인보기를위한 2 개의 부분적인 전망 및 unauthorized 케이스를위한 다른 것을 가지고있을 것입니다.-

+0

의견을 보내 주셔서 감사합니다. 할 수만 있다면 나는 그런 것을 피하려고 노력했다. – MattW

관련 문제