Подтвердить что ты не робот

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 сам.

(Как я уже упоминал в начале, это одностраничное приложение, поэтому я не могу просто перенаправить их на другой вид).

Заранее благодарим за помощь!

4b9b3361

Ответ 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.");
  }
}

Я бы не рекомендовал эту оценку, у меня было бы два частичных вида один для обычного вида, а другой для ошибки/несанкционированного случая.