2012-05-14 8 views
42

ASP.NET MVCで単一ページのajaxアプリケーションを作成しています.jQueryを大量に使用しています。ASP.NET MVC - 別のオブジェクトと共にAjaxにPartialViewを返す

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を返したいのですが、ポップアップウィンドウにメッセージを表示してなぜ彼らは彼らが求めたものとは異なるビューを持っていたのですか?

ので - これを行うために、私は次の操作を実行したいと思います:

コントローラー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で良いオブジェクトを取得しますが(私が見たいと思うもの)、jsReturnArgs.Viewプロパティの完全なHTML文字列を取得する方法はわかりません。

私はちょうどPartialViewを返すだけで返される同じ文字列を探しています。

(私が最初に触れたように、これは単一のページアプリなので、別のビューにリダイレクトすることはできません)。

ありがとうございました! JSONとしてエンコード複数のパラメータとあなたのhtmlでJSONを返すために持っスキップする

答えて

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

一つの方法は、常に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つの部分的なビューを持っています。 -

+0

私は入力を感謝します!もし私ができるなら、私はそれのようなものを避けようとしていました。 – MattW

関連する問題