Я возвращаю ошибку http в JQGrid, но вижу код 200

Имейте веб-API, делающий crud, и интерфейс mvc. Во внешнем контроллере это код редактирования для jqgrid:

    [HttpPost]
    public JsonResult EditRecipientActivity(RecipientActivity model)
    {
        var result = HttpStatusCode.BadRequest;
        if (ModelState.IsValid)
        {
            if (model.ActCount > 0)
            {
                var response = repo.SaveUpdatedRecipientActivity(model);
                if (!response.IsSuccessStatusCode)
                {
                    result = HttpStatusCode.BadRequest;
                }
                else
                {
                    result = HttpStatusCode.OK;
                }

                return Json(result, JsonRequestBehavior.AllowGet);
            }
            else
            {
                var response = repo.AddRecipientActivity(model);
                return Json(response.IsSuccessStatusCode, JsonRequestBehavior.AllowGet);
            }
        }
        return Json(false, JsonRequestBehavior.AllowGet);
    }

Я пытаюсь передать ошибку сервера из веб-API в jqgrid, поэтому сообщение появляется в форме редактирования.

С помощью этого кода я могу отправить только код состояния в форму, но фактический статус в заголовке равен 200, даже если контроллер возвращает 400. Как мне передать фактический код состояния в форму?

РЕДАКТИРОВАТЬ: Изменен метод контроллера. Я не могу использовать Request.CreateResponse, я думаю, потому что это не контроллер API:

    [HttpPost]
    public HttpResponseMessage EditRecipientActivity(RecipientActivity model)
    {
        var response = repo.SaveUpdatedRecipientActivity(model);
        return response;
    }

Это результат, отправленный на веб-страницу:

StatusCode: 500, ReasonPhrase: 'Internal Server Error', версия: 1.1, Содержание: System.Net.Http.StreamContent, заголовки: {Pragma: нет-кэш X-исходников,??? = UTF-8 B QzpcX1ZTX1Byb2plY3RzXHRlc3RcU0ZBQVJfU1ZDXFNGQUFSX1NWQ1xyZWNpcGllbnRcdXBkYXRlYWN0aXZpdHlcMTIzMTIzMTIz = Persistent -Auth: true Cache-Control: no-cache Дата: среда, 02 сентября 2015 г., 16:44:13 GMT Сервер: Microsoft-IIS/8.0 X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Content -Длина: 2378 Content-Type: application/json; charset=utf-8 Срок действия: -1 }

Это то, на что я надеялся, но это не вызвало сообщение об ошибке jqGrid. Есть идеи, почему?

РЕДАКТИРОВАТЬ 2: Вот код navGrid:

        $("#activity-grid").jqGrid('navGrid', '#grid-pager',
            { edit: true, add: true, del: false, search: true, refresh: true },
            { //edit parameters
                editData: { FV: fv, RecipKey: recipientId },
                beforeShowForm: function (form) { $("#tr_ActCount", form).hide(); }, // Hides the ActCount field from the modal form
                closeAfterEdit: true

            },
            { //add parameters
                editData: { FV: fv, ActCount: 0 },
                beforeShowForm: function (form) { $("#tr_ActCount", form).hide(); },  // Hides the ActCount field from the modal form
                closeAfterEdit: true
            }

person BattlFrog    schedule 01.09.2015    source источник


Ответы (1)


Одним из возможных способов было бы использовать HttpResponseMessage в качестве возвращаемого типа метода EditRecipientActivity и использовать Request.CreateResponse с HttpStatusCode.BadRequest или любым другим значением в качестве первого параметра Request.CreateResponse. Это позволит установить код ошибки HTTP в ответе сервера. Текущий код, который вы используете, просто устанавливает числовое или логическое значение в ответе на подачу.

В качестве альтернативы вы можете использовать throw new HttpResponseException(HttpStatusCode.BadRequest); (или другую ошибку HTTP).

jqGrid предоставляет вам еще одну возможность, но ее следует использовать только в том случае, если используемый вами фреймворк не предоставляет возможности установить HTTP-код ошибки в ответе сервера. В этом случае можно использовать afterSubmit обратный вызов редактирования формы . Обратный вызов получает jqXHR в качестве первого параметра, и можно использовать свойство responseText для получения тела ответа сервера (в настоящее время вы возвращаете информацию об ошибке в теле ответа сервера). Обратный вызов afterSubmit должен возвращать [true], если ответ от сервера следует интерпретировать как успешный, и возвращать [false, "error message"] в случае ошибки.

person Oleg    schedule 01.09.2015
comment
Спасибо Олег. Теперь я получаю ожидаемый ответ, но он не вызывает сообщение об ошибке в форме. См. редактирование выше. - person BattlFrog; 02.09.2015
comment
@BattlFrog: Извините, но я не вижу, какая информация теперь будет помещена в тело ответа EditRecipientActivity. Код статуса теперь 500, поэтому в форме редактирования будет отображаться текст из тела ответа, который вообще может быть HTML-фрагментом. Было бы очень полезно, если бы вы включили текущий код JavaScript, который вы используете. Если вы используете редактирование формы, определенное в панели навигации, то достаточно будет увидеть параметры navGrid, которые вы используете. - person Oleg; 02.09.2015
comment
Хорошо, я добавил код navGrid. Немного необычно то, что я использую веб-интерфейс MVC, поэтому вызовы WEB API не поступают напрямую из кода jqGrid, они идут: jqGrid > MVC-контроллер > WEB API-контроллер и обратно. Не уверен, что это имеет значение, но решил упомянуть об этом. - person BattlFrog; 02.09.2015
comment
@BattlFrog: вы можете добавить обратный вызов errorTextFormat: function (jqXHR) { alert("error: " + jqXHR.responseText); return "Error: BlaBla!" } в блок //edit parameters и в //add parameters. Обратный вызов должен быть вызван. Используя jqXHR, вы можете получить доступ к телу ответа, коду состояния или любым заголовкам HTTP. Таким образом, вы можете расшифровать ответ об ошибке в любой форме, которую хотите отобразить в форме редактирования. Вероятно, ответ поможет вам понять больше возможностей, которые вы можете использовать. - person Oleg; 02.09.2015
comment
В итоге я использовал вариант вашего кода. Я оставил jqGrid как есть и переключился, возвращая HttpStatusCodeResult: return new HttpStatusCodeResult(HttpStatusCode.OK, обновление выполнено успешно!); Работает как шарм. Спасибо за помощь, Олег. - person BattlFrog; 02.09.2015