В ASP.Net MVC, каков наилучший способ сделать обновление из диалога? - PullRequest
1 голос
/ 17 ноября 2009

Я пытаюсь объединить 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 возможных решения, но оба имеют недостатки:

  1. Используйте действия контроллера jQuery + 2: 1) Отсылает сообщение об успехе / неудаче и, в случае успеха, код на стороне клиента будет 2) использовать Ajax-вызов к Customers / List и обновлять #CustomerList.

    Pro: просто. Легко понять. Может повторно использовать действие контроллера «Клиенты / список», которое уже существует.

    Con: Требуется 2 вызова на сервер. На данный момент производительность не является проблемой, но в прошлом я работал в местах, где не думали о количестве вызовов, и это постепенно нарастает как проблема, от которой вы не можете легко выйти.

  2. Использовать jQuery + 1 действие контроллера. Вернуть JsonResult, который включает 1) успех / неудачу и 2) обновленные результаты #CustomersList.

    Pro: 1 сервисный звонок.

    Con: сложность. #CustomersList изначально создается с использованием частичного представления и очень простого метода контроллера. Возвращая результат Json, не совсем понятно, как частичное представление CustomersList.ascx вписывается в рисунок.

  3. 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 понять, что произошла ошибка, но также дает мне возможность лучше настраивать то, что возвращается. Здесь я просто решил отправить одно общее сообщение об ошибке, но в будущем я, вероятно, сделаю это более надежным.

Ответы [ 2 ]

1 голос
/ 17 ноября 2009

У вызова ajax JQuery есть обработчики функций для успеха и неудачи. Если вы сгенерируете исключение, содержащее текст вашего сбоя, вы можете использовать один серверный вызов. Результатом будет успех или неудача, вызов различных функций обработки, каждая из которых точно знает, где показать результаты и как получить их из полученного объекта JSON.

Взгляните на http://docs.jquery.com/Ajax/jQuery.ajax, чтобы увидеть описание параметров успеха и ошибок для метода ajax () в JQuery. (Используйте ошибку, как успех.)

0 голосов
/ 17 ноября 2009

Простой - как часть цикла POST / Response, передайте переменную, сообщающую UI, где обновить содержимое, например, ID списка или DIV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...