Я пытаюсь объединить 2 части MVC, которые я не видел, использованные вместе: 1) Ajax и 2) Обработка ошибок. Проблема заключается в том, что возвращается и куда (элемент div для обновления) возвращается.
У меня есть страница ASP.net MVC, которая выглядит следующим образом
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<Store>" %>
<div id="MainPage>
<div id="Some Stuff>
Lorem Ipsum
</div>
<div id="CustomerList>
<% Html.RenderPartial("~/Views/Customers/List.ascx", Model.Customers); %>
</div>
<div id="dialog">
<div id="dialogErrorMessage"></div>
</div>
</div>
Частичным представлением списка клиентов будет таблица со списком клиентов. Каждая запись будет иметь ссылку «Изменить», которая откроет диалоговое окно с информацией из частичного представления Customers / Edit.ascx, которая будет выглядеть следующим образом:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Customer>" %>
<fieldset>
<p>
<label for="CustomerName"></label>: <%= Html.TextBox("CustomerName", Model.CustomerName)) %>
</p>
<p>
<label for="CustomerAddress"></label>: <%= Html.TextBox("CustomerAddress", Model.CustomerAddress)) %>
</p>
<p>
<input id="btnSave" type="submit" value="Save" />
</p>
</fieldset>
Если щелкнуть btnSave, он отправит сообщение для Клиентов / Изменить. Если обновление выполнено успешно, диалоговое окно должно закрыться и #CustomersList должен обновиться. Однако , если обновление завершится неудачно, #dialog должен остаться открытым и #dialogErrorMessage должен отобразить «Update Failed, ошибка бла, бла ...».
Вот где я застрял. Как вспомогательные методы ASP.Net MVC Ajax, так и библиотека jQuery позволяют создавать сообщения Ajax и легко заменяют div, однако в большинстве примеров клиент знает, какой div чтобы заменить до , он вызывает Ajax. В моем примере обработки ошибок клиент не знает, какой div обновлять, до после , он узнает, что обновление прошло успешно. Я предложил 2 возможных решения, но оба имеют недостатки:
-
Используйте действия контроллера jQuery + 2: 1) Отсылает сообщение об успехе / неудаче и, в случае успеха, код на стороне клиента будет 2) использовать Ajax-вызов к Customers / List и обновлять #CustomerList.
Pro: просто. Легко понять. Может повторно использовать действие контроллера «Клиенты / список», которое уже существует.
Con: Требуется 2 вызова на сервер. На данный момент производительность не является проблемой, но в прошлом я работал в местах, где не думали о количестве вызовов, и это постепенно нарастает как проблема, от которой вы не можете легко выйти.
- Использовать jQuery + 1 действие контроллера. Вернуть JsonResult, который включает 1) успех / неудачу и 2) обновленные результаты #CustomersList.
Pro: 1 сервисный звонок.
Con: сложность. #CustomersList изначально создается с использованием частичного представления и очень простого метода контроллера. Возвращая результат Json, не совсем понятно, как частичное представление CustomersList.ascx вписывается в рисунок.
- ASP.Net MVC Вспомогательные методы Ajax - я не вижу, чтобы это вообще обеспечивало решение, потому что его основная методология - обновить цель с помощью UpdateTargetID.
Я все еще относительно новичок в jQuery и занимаюсь серьезным Ajax-программированием. Я знаю, что оба способа могут работать, но я хотел бы знать, «почему» один выбор лучше, чем другой. Из многих болезненных программ Javascript я узнал от Дугласа Крокфорда и других, что шаблоны программирования в Javascript не совпадают с C # на стороне сервера, Java и т. Д.
Как лучше?
РАЗРЕШЕНИЕ
По рекомендации Джона я изучил функциональность ошибок, встроенную в jQuery $ .ajax, однако был еще один элемент, который мне не хватало:
В контроллере нужно было поставить
catch(Exception ex)
{
Response.StatusCode = 500;
return Content("An Error occured.");
}
Первоначально я решил просто выбросить исключение. Это заставило ошибку работать, но я действительно хотел, чтобы пользовательское сообщение пришло с сервера, а не исключение ASP.Net.
Добавление строки Response.StatusCode = 500 позволяет jQuery понять, что произошла ошибка, но также дает мне возможность лучше настраивать то, что возвращается. Здесь я просто решил отправить одно общее сообщение об ошибке, но в будущем я, вероятно, сделаю это более надежным.