web-dev-qa-db-ja.com

ASP.NET MVC-PartialViewを別のオブジェクトとともにAjaxに返す

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

これはうまく機能します。 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); }
});

この[〜#〜] sorta [〜#〜]は現在動作しています。 JavaScriptで適切なオブジェクトを取得します(表示されるはずです)が、jsReturnArgs.Viewプロパティの完全なHTML文字列を取得する方法がわかりません。

PartialViewを返すだけの場合に返される同じ文字列を実際に探しています。

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

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

45
MattW

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

部分ビューと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); }
});
44
MattW

複数のパラメーターとjsonとしてエンコードされたhtmlを使用してjsonを返すことをスキップする1つの方法は、常にHTMLを送信することですが、ステータスが設定された非表示フィールドなどを送信することです。

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

私はこのアプローチをお勧めしません。私は2つの部分ビューを通常ビュー用とエラー/不正ケース用に2つ持っています。

6
Baz1nga