Как вернуть объект JSON при неверном запросе MVC

Я работаю над проектом MVC 4.

У меня есть действие, которое выполняется, когда выполняется запрос Ajax Post.

В некоторых случаях, которые я мог точно определить, я должен установить для свойства Status объекта Response значение HttpBadRequest И вернуть объект JSON, который содержит некоторые данные для отображения конечному пользователю.

проблема в том, что я НЕ могу получить объект JSON в методе javascript, я получаю что-то еще. и это потому, что я устанавливаю свойство Status значения Response to HttpBadRequest.

Вот подробности

Действие

// this method will executed when some Ajax Post request.
[HttpPost]
public ActionResult Delete(int id)
{
    // some code here ......

    // in some case we will determine an error like this
    if(error)
    {
        HttpContext.Response.Clear();
        HttpContext.Response.TrySkipIisCustomErrors = true;
        HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;

        return Json(new
        {
            Message = string.Format(format, values),
            Status = messageType.ToString()
        });
    }
}

и я хочу прочитать этот возвращенный объект JSON из функции javascript, подобной этой

JavaScript

function OnDeleteFailed(data) {
    debugger;
    var try1 = $.parseJSON(data.responseText);
    var try2 = JSON.parse(data.responseJSON);
}

проблема в том, что объект JSON НЕ заполняет переменную data javascript. при отладке кода Javascript я получаю следующее в переменной data

введите здесь описание изображения

Самое странное, что когда я удаляю эту строчку из Action

HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;

затем я правильно получил объект JSON и смог прочитать его следующим образом

введите здесь описание изображения

Примечание. Я получаю правильный объект JSON, но в другой функции Javascript. (теперь я получаю объект JSON в функции OnDeleteSuccess, а не в функции OnDeleteFailed.

Итак, Вопрос: что не так с кодом, поэтому объект JSON не будет получен в функции javascript, если я установлю для свойства StatusCode объекта Response значение BadRequest?

Я много искал ответ (со вчерашнего дня до сегодняшнего дня), и после долгих поисков это самый актуальный вопрос ко мне, но, к сожалению, решение этого вопроса у меня вообще не сработало.

Обновлено

вот фрагмент файла Web.config, который устанавливает некоторые из httpErrors IIS. Это обновление, чтобы ответить на предположение, что причина ошибки исходит из этой точки

<system.webServer>
   <httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="404" />
      <error statusCode="404" responseMode="ExecuteURL" path="/Home/PageNotFound" />
   </httpErrors>
</system.webServer>

Любые идеи будут оценены.


person Hakan Fıstık    schedule 15.10.2015    source источник
comment
Вероятно, это пользовательские ошибки IIS, которые мешают ответу.   -  person haim770    schedule 15.10.2015
comment
@ haim770 haim770 Я установил некоторую пользовательскую ошибку в файле web.config, связано ли это с моей проблемой   -  person Hakan Fıstık    schedule 15.10.2015
comment
@ haim770 Я отредактирую свой вопрос, включив в него фрагмент файла Web.Config, который содержит некоторую пользовательскую ошибку IIS.   -  person Hakan Fıstık    schedule 15.10.2015
comment
<customErrors mode="Off" /> младше <system.web>?   -  person haim770    schedule 15.10.2015
comment
Попробуйте изменить existingResponse на PassThrough   -  person haim770    schedule 15.10.2015
comment
нет тега ‹customError› в разделе ‹system.web› web.config, вы имеете в виду, что я должен написать этот статус?   -  person Hakan Fıstık    schedule 15.10.2015
comment
Давайте продолжим обсуждение в чате.   -  person Hakan Fıstık    schedule 15.10.2015
comment
Якобы ваши TrySkipIisCustomErrors должны быть эквивалентны. Но попробуй и увидишь   -  person haim770    schedule 15.10.2015
comment
Если вы можете использовать некоторые WebAPI, сделайте что-то вроде - return Request.CreateResponse(HttpStatusCode.BadRequest, myErrorJsonObj);   -  person Dayan    schedule 15.10.2015
comment
@Dayan Я не мог использовать WebAPI   -  person Hakan Fıstık    schedule 15.10.2015
comment
@ haim770, пожалуйста, поместите свой ответ здесь.   -  person Hakan Fıstık    schedule 15.10.2015


Ответы (1)


В своем Web.Config попробуйте изменить existingResponse на Auto:

<httpErrors errorMode="Custom" existingResponse="Auto">

См. документацию.

person haim770    schedule 15.10.2015
comment
Согласно этому ответу: stackoverflow.com/a/21271085 - Auto лучше, так как он будет учитывать TrySkipIisCustomErrors и будет только Replace, если это не установлено. - person haim770; 15.10.2015