50

ASP.NET MVC を使用して単一ページの ajax アプリを作成しています - jQuery を多用しています。アプリ全体で次のようなことを行います。

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

これはうまくいきます。(viewHTMLajaxsuccess関数内の)は文字列として返され、問題なくページに押し込むことができます。

ここでやりたいことは、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); }
});

このSORTAは現在機能しています。jsReturnArgs.ViewJavaScript で適切なオブジェクトを取得できますが (期待しているもの)、プロパティ の完全な HTML 文字列を取得する方法がわかりません。

をそのまま返すだけの場合に返されるのと同じ文字列を探しているだけですPartialView

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

助けてくれてありがとう!

4

2 に答える 2

47

だから-次の投稿を使用して、これを機能させました:

部分ビューと Json (または両方)

ビューを文字列としてレンダリングする

どちらもうまくレイアウトしてから、コードを次のように変更しました。

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); }
});
于 2012-05-14T20:14:56.017 に答える
7

複数のパラメーターを含む json を返す必要がなく、json としてエンコードされた html をスキップする 1 つの方法は、常に HTML を送信することですが、ステータスが設定されている隠しフィールドなどを送信します。

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

このアプローチはお勧めしません.1つは通常のビュー用で、もう1つはエラー/無許可の場合用の2つの部分ビューがあります..

于 2012-05-14T19:33:41.863 に答える