Могу ли я добавить ответ json при возврате вида MVC с моделью? - PullRequest
1 голос
/ 28 марта 2019

Есть ли способ добавить результат JSON, который будет использоваться параметрами OnSuccess или OnFailure AJAX.BeginForm, когда контроллер использует синтаксис возврата View (модель)?

Все довольно стандартно C # / MVC. Ajax.BeginForm будет выглядеть так

@using (Ajax.BeginForm("AnyAction", "Home", null,
    new AjaxOptions
    {
        HttpMethod = "Post",
        OnBegin = "OnBegin",
        OnFailure = "OnFailure(xhr, status)",
        OnSuccess = "OnSuccess(xhr, status)"
    },
    new { id = "myform" }))

Сценарии OnSuccess и OnFailure определены следующим образом

    function OnSuccess(xhr, status) {
        console.log("OnSuccess");
    }
    function OnFailure(xhr, status) {
        console.log("OnFailure");       
    }

Контроллер возвращается вот так

    HttpContext.Response.StatusCode = (int)HttpStatusCode.NotAcceptable;
    return View(model);

Я могу добавить HTTPStatusCode, OK или Not OK, в HTTPContext.Response, и это вызовет функции JavaScript OnSuccess или OnFailure. Исходя из этого, я знаю, что могу манипулировать потоком ответов, но есть ли возможность добавить JSON-ответ в HTTPContext.Response, чтобы OnSuccess или OnFailure могли его использовать.

Как передать это, используя синтаксис возврата View (модель), в функцию OnSuccess?

dynamic jsonMessage;
jsonMessage = new { param1 = "ModelState", param2 ="Error", param3 = "Error Message" };

Несколько быстрых заметок:

Это не требование, просто вопрос.

Я уже использую Return JSON (jsonMessage, JsonRequestBehavior.AllowGet) где-то еще в моем проекте, помощь в этом не требуется.

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Я хотел узнать мое окончательное решение. Сначала нам нужно настроить определение OnSuccess свойства Ajax.BeginForm, чтобы оно выглядело следующим образом. Я попробовал несколько вариантов этого, но этот точный код - единственный, который работал.

@using (Ajax.BeginForm("AddUserRole", "AppRoles", null,
    new AjaxOptions
    {
        HttpMethod = "Post",
        OnBegin = "OnBegin",
        OnFailure = "OnFailure(xhr, status)",
        OnSuccess = "OnSuccess(data, status, xhr)"
    },
    new { id = "myform" }))

Далее javascript для OnSuccess выглядит следующим образом. Несколько вещей, чтобы отметить; Сначала контроллер, показанный ниже, может вернуть либо JsonResult, либо View / Model. Функция OnSuccess будет запущена независимо от того, какая из них будет возвращена, если HttpResponseStatus в порядке. Если контроллер возвращает представление / модель, то в параметре данных будет содержаться весь визуализированный вид, а нужный мне json будет в параметре XHR. Для работы с ответом json его нужно извлечь с помощью getResponseHeader и затем сериализовать в JSON. После этого мы можем работать с ним как с обычным старым объектом JSON.

function OnSuccess(data, status, xhr) {
    console.log("OnSuccess");
    // this is for capturing from the Response header WHEN the controller returns a view
    var srchMessage = xhr.getResponseHeader("srchMessage")
    if (srchMessage != null) {
        var srchJson = JSON.parse(srchMessage);
        console.log("srchMessage:param1" + srchJson.param1);
        return;
    }
    // this is for capturing the json WHEN the controller returns a JsonResult
    if (xhr.responseJSON != null) {
        console.log("xhr.responseJSON.param1" + xhr.responseJSON.param1);
    }
}

Контроллер MVC может возвращать либо «короткий» JsonResult, либо полный вид, выглядит примерно так

public ActionResult AjaxTest(AppModel model)
{
    if (model.status == "ReturnView")
    {
        jsonMessage = new { param1 = "param1", param2 = "param2", param3 = "param3" };
        string jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(jsonMessage);
        HttpContext.Response.AddHeader("srchMessage", jsonString);
        HttpContext.Response.StatusCode = (int)HttpStatusCode.OK;
        return View(model);
    }

    if (model.status == "ReturnJSON")
    {
        jsonMessage = new { param1 = "param1", param2 = "param2", param3 = "param3" };
        HttpContext.Response.StatusCode = (int)HttpStatusCode.OK;
        return Json(jsonMessage, JsonRequestBehavior.AllowGet);
    }
}

Я не уверен, почему я хотел сделать это, у меня должны быть отдельные контроллеры для разных действий, но это то, как это можно сделать, если вы хотите это сделать.

1 голос
/ 28 марта 2019

Поскольку ваш JSON небольшой, вы можете добавить строку JSON в качестве заголовка ответа, используя

HttpContext.Response.AddHeader("json", "json_string");.

Затем к нему можно получить доступ из значения заголовка в методе OnSuccess / Failure.

...