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
を返すだけの場合に返される同じ文字列を実際に探しています。
(冒頭で述べたように、これは単一ページのアプリです。したがって、別のビューにリダイレクトすることはできません)。
助けてくれてありがとう!
だから-次の投稿を使用して、私はこれを機能させました:
彼らは両方ともうまくレイアウトしてから、コードを次のように変更しました:
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); }
});
複数のパラメーターと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つ持っています。