Asp.net в MVC - jQuery с $.ajax ошибка обратного вызова не возвращает responseJSON
У меня есть код ниже, с отлично работает на машине разработки, но не при вызове из удаленного браузера...
$.ajax({
type: 'POST',
url: '@Url.Action("Action", "Controller")',
data: { id: id },
dataType: 'json',
async: true,
success: function (data) {
},
error: function (jqXHR, status, err) {
var result = jqXHR.responseJSON;
}
});
в jqXHR.объект responseJSON работает при вызове из localhost, но не при вызове с удаленного компьютера, он возвращается как неопределенный... Кто-нибудь может мне помочь? Заранее спасибо!
2 ответов
у меня была такая же проблема.
При тестировании на моей локальной машине с помощью localhost заполняется ResponseJSON.
Когда я загружаю свой проект на тестовый сервер и тестирую, мой responseJSON не определен, и responseTEXT просто дает statusdescription, который я отправил:
(это JSONResult, но я сделал это как ActionResult)
Response.StatusCode = 400;
Response.StatusDescription = "Bad Request - Model State is Invalid";
return Json(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ModelState.Values.SelectMany(v => v.Errors)), JsonRequestBehavior.AllowGet);
и для ActionResult специально я также попробовал:
return new HttpStatusCodeResult(400, new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ModelState.Values.SelectMany(v => v.Errors)));
что дало мне кучу ошибки.
я попробовал с JsonResult следующий код, который работал локально (но у меня была синтаксическая ошибка в JSON), но не работал на тестовом сервере.
return Json(new { success = false, responseJSON = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ModelState.Values.SelectMany(v => v.Errors)) }, JsonRequestBehavior.AllowGet);
это недавний тест (выше), когда я использовал запрос AJAX для отправки модели формы контроллеру MVC. Я читал, что это потому, что он идет через домен, но это не имеет смысла.
Я создал контроллер веб-API и поместил туда информацию о методе. Это потому, что я хотел использовать HttpReponseMessage и я подумал, что это тип WebAPI. После того, как модель и json и все, чтобы работать вместе, я протестировал и угадайте, что?
когда я использую HttpResponseMessage в качестве возвращаемого типа в WebAPI и возвращаю так:
return Request.CreateResponse(HttpStatusCode.BadRequest, new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ModelState.Values.SelectMany(v => v.Errors)));
responseJSON и responseText оба заполняются правильно.
Я не знаю, почему это не работает иначе, и если у кого-то есть ответ на это, пожалуйста, сообщите нам.
мне это обойти потому что я чувствую, что это должно было сработать первым способом.
обновление: Использование исходного кода с контроллером MVC-и добавление
Response.TrySkipIisCustomErrors = true;
заставил responseJSON появиться.
как предположил туманный,Response.TrySkipIisCustomErrors = true;
Кажется, это правильный путь.
к сожалению, большую часть времени IIS
проигнорирует это свойство и пропустит его (возможно, поэтому разработчики называют его Try
...).
однако я исправил проблему, добавив Это на Web.config
:
<system.webServer>
<httpErrors existingResponse="PassThrough" />
</system.webServer>
который чище и не "грязный" часть кода.
надеюсь, что это помогает.