2012-05-14 62 views
42

我正在用ASP.NET MVC編寫單頁ajax應用程序 - 大量使用jQuery。我做一些類似以下內容的整個應用程序:ASP.NET MVC - 將部分視圖與另一個對象一起返回到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函數中)作爲字符串返回,我可以將它推到頁面上沒有問題。

現在我想要做的是不僅返回部分視圖HTML字符串,而且還返回某種狀態指示器。這是一個權限問題 - 例如,如果有人試圖訪問他們沒有權限的應用程序的一部分,我想返回一個不同於他們要求的PartialView,並在彈出窗口中顯示一條消息,告訴他們爲什麼他們的視圖與他們所要求的不同。

所以 - 要做到這一點,我想做到以下幾點:

控制器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); } 
}); 

SORTA工作現在。我在JavaScript中獲得了一個很好的對象(我期待看到),但是我看不到如何獲取jsReturnArgs.View屬性的完整HTML字符串。

我真的只是尋找相同的字符串,如果我只是自己返回PartialView就會返回。

(正如我在開始時提到的,這是一個單頁面應用程序 - 因此我不能將它們重定向到另一個視圖)。

在此先感謝您的幫助!

回答

40

所以 - 使用下面的帖子中,我得到了這個工作:

Partial Views vs. Json (or both)

Render a view as a string

他們都攤開來好聽,於是我改變了我的代碼如下:

C# :

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

我wouldnt推薦這個appraoch我會有兩個部分視圖一個爲正常的觀點,另一個爲錯誤/未授權的情況..

+0

我很欣賞的投入!如果可以的話,我試圖避免這樣的事情。 – MattW

相關問題