ASP.NET MVC - Возвращение PartialView в Ajax вместе с другим объектом
Я пишу одностраничное приложение ajax с помощью ASP.NET MVC, что значительно облегчает использование jQuery. В приложении все что-то похожее на следующее:
JS:
$.ajax({
type: "GET",
url: "/Home/GetSomePartialView/",
data: someArguments,
success: function (viewHTML) {
$("#someDiv").html(viewHTML);
},
error: function (errorData) { onError(errorData); }
});
Контроллер С#:
public ActionResult GetSomePartialView(SomeArgumentModel someArguments)
{
return PartialView("_CaseManager");
}
Это отлично работает. viewHTML
(в функции ajax success
) возвращается в виде строки, и я не могу записать его на страницу без проблем.
Теперь то, что я хотел бы сделать, это вернуть не только строку PartialView HTML, но и некоторый индикатор состояния. Это вопрос с разрешениями - например, если кто-то пытается получить часть своего приложения, у него нет разрешения, я хочу вернуть другой PartialView, чем они просили, а также отобразить сообщение во всплывающем окне, сообщающем им почему они получили представление, отличное от того, что они просили.
Итак - для этого я хотел бы сделать следующее:
Контроллер С#:
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 (что я ожидаю увидеть), однако я не вижу, как получить полную строку HTML свойства jsReturnArgs.View
.
Я действительно ищу ту же строку, которая была бы возвращена, если бы я просто возвращал PartialView
сам.
(Как я уже упоминал в начале, это одностраничное приложение, поэтому я не могу просто перенаправить их на другой вид).
Заранее благодарим за помощь!
Ответы
Ответ 1
Итак - используя следующие сообщения, я получил эту работу:
Частичные виды против Json (или оба)
Отобразить представление в виде строки
Они оба хорошо описывают это, затем я изменил свой код на следующее:
С#:
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); }
});
Ответ 2
один из способов пропустить, чтобы вернуть 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.");
}
}
Я бы не рекомендовал эту оценку, у меня было бы два частичных вида один для обычного вида, а другой для ошибки/несанкционированного случая.