Я уже несколько дней занимаюсь разработкой веб-приложения на своем локальном компьютере с использованием Visual Studio 2010. Прошлой ночью я развернул свое приложение на IIS 7 и разочарованно наткнулся на главный ограничитель шоу.Проблема связана с обработкой ошибок в Ajax-запросе.Для начала у меня есть несколько экранов редактирования, которые работают по запросу ajax.Вот как выглядит ajax-часть экрана редактирования Ajax.
@using (Ajax.BeginForm("_CityEdit", null, new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "content",
LoadingElementId="imgSaveLoading", OnFailure="onError",
OnSuccess = "onSuccess" }, new { id = "frmCity" })) {
<img id="imgSaveLoading" alt="loading" src="@Url.Content("~/Content/Telerik/Vista/loading.gif")" class="ajax-loader-user" />
<div class="content" id="content">
@{Html.RenderPartial("_CityEdit");}
</div>
<!-- Some Other code here -->
}
Я полагался на обратный вызов onError вышеупомянутого Ajax.BeginForm ().Поэтому в моем контроллере всякий раз, когда я хотел отобразить ошибку для пользователя (ошибка модели или любую другую ошибку), я просто устанавливал отклик сервера на 500 (Внутренняя ошибка сервера), оптимистично надеясь, что это приведет к обработчику «OnError» Ajax.BeginForm() вызывается.Вот фрагмент того, как я это сделал в своем контроллере.
[HttpPost]
public ActionResult _CityEdit(CityViewModel viewModel) {
city = cityManager.FindCity(viewModel.City.Id, false);
// Validate Model here
if (!TryUpdateModel(city, "City")) {
Response.StatusCode = 500;
return PartialView("_CityEdit", viewModel);
}
Как видно из приведенного выше кода, я вернул PartialView и, если он содержал ошибки модели, они автоматически отобразятся на экране редактирования Ajax.,Затем в JavaScript «OnError» я просто заменяю связанный div на PartialView, возвращаемый контроллером, примерно так:
function onError(xhr) {
$('#content').html(xhr.responseText);
}
Все это прекрасно работает на моей машине для разработки.Когда я развернул свое приложение на IIS 7 и получил доступ к нему из окна Windows XP (с IE 8 или Chrome) вместо PartialView, браузеры просто отобразили экран «500 Internal Server Error» по умолчанию.Поэтому у меня есть несколько сомнений, из-за которых я не спал прошлой ночью.
Является ли подход, который я использовал для редактирования Ajax, разумным.Если бы не то, что могло бы быть другим способом, я мог бы обработать Ajax Editing (с возможностью отображения ошибок модели).
Так как я разрабатывал эти модули уже несколько дней иприложить значительные усилия, есть ли обходные пути, чтобы заставить его работать на XP box.По сути, было бы идеально, если бы я мог как-то запретить браузеру отображать экран по умолчанию «500 Internal Server Error».
Этот подход работает в Windows 7, потому что у меня установлен IIS 7на той же машине с Windows 7, которую я использую для просмотра сайта, или просто она хорошо работает с Windows 7.
Если есть какие-либо другие предложения, пожалуйста, продолжайте.
Редактировать: я нашел обходной путь для моей проблемы.Таким образом, это означает, что сомнения № 2 и 3 даны ответы.По сути, следующая запись в web.config запрещает браузеру отображать страницы браузера по умолчанию для веб-сайта.
<system.webServer>
<httpErrors errorMode="Detailed"/>
</system.webServer>
Но это все же оставляет мои первые сомнения.Использовал ли я разумный подход к редактированию Ajax?
Я проверил ответ с помощью фиддлера, и именно IIS отправлял страницу ошибки по умолчанию для ошибки 500 сервера. Поэтому его необходимо настроить для возврата"Подробный ответ.Мы можем сделать это с помощью диспетчера IIS.Другой вариант, за которым я следовал, - определить его на уровне приложения в файле web.config приложения.
Однако у меня опять возникает дилемма: идти ли с этим подходом или переделывать всю мою заявку.Проблема, которая возникает, заключается в том, что если действительно происходит сбой какого-либо модуля с 500 Internal Server, мой код отображается в браузере, поскольку для errorMode установлено значение «Подробно».Поэтому мне нужен какой-то способ предоставить свой собственный ответ, когда я устанавливаю код ошибки ответа на 500, и если какая-либо другая часть приложения выходит из строя (я не настраиваю 500 кодов состояния), то должна быть отправлена страница ошибки по умолчанию вместо того, чтобы выставлять мой кодчерез «Детальный» ответ.Любая помощь, пожалуйста.
С уважением, NIrvan.