Кажется, есть несколько способов интегрировать диалоги jQuery с ASP.NET MVC. Имеет ли конкретный подход как общепринятый способ наилучшей практики?
В качестве примера: у меня есть страница списка, где нажатие "edit" для любого из перечисленных элементов открывает форму в диалоговом окне jQuery, заполненном деталями. Пользователь редактирует детали и нажимает "Сохранить". Если сохранение успешно выполняется на стороне сервера, диалог закрывается, и список перестраивается со свежими данными. Если сбой сбоя на стороне сервера, диалог остается открытым и отображает сообщение об ошибке пользователю.
- Подход No-JSON: каждая ссылка "edit" является HREF для действия контроллера "edit". Это действие контроллера создает представление, которое идентично представлению "список", плюс оно включает частичное действие для создания формы редактирования, заполнения и определения javascript, чтобы открыть его как диалог jquery. "Сохранить" - это форма-сообщение; если он преуспевает, он возвращает действие перенаправления на страницу списка. Если это не удается, он перестраивает всю страницу (включая форму, которая появляется в диалоговом окне), также отображая сообщения об ошибках.
- подход All-JSON: страница списка отображает пустую форму редактирования (скрытую), готовую к открытию в диалоговом окне. Ссылка "edit" вызывает локальный javascript, который выполняет запрос ajax для получения полного объекта (я определяю контроллер, который возвращает полный объект как JsonResult). При успехе он заполняет форму редактирования данными объекта и открывает диалог. Ссылка "save" вызывает локальный javascript, который связывает данные формы с объектом json и вызывает операцию post с этим json-объектом в качестве полезной нагрузки (я определяю контроллер, который ожидает этот объект, пытается сохранить и возвращает JsonResult, указывающий на успех/отказ + ErrorMessages). Обратный вызов успеха из запроса ajax оценивает возвращаемый объект и отображает сообщения об ошибках в диалоговом окне все еще открытого jquery или закрывает диалоговое окно и перезагружает страницу "Список", чтобы получить свежие данные в списке.
- [Изменить] Ajax-HTML-подход: просто увидел эту дискуссию, в которой описывается другой подход. "Редактировать" вызывает локальный javascript, который выполняет пост ajax, чтобы получить ПОЛНЫЙ HTML-диалог (я бы написал контроллер, который возвращает частичное представление: полностью заполненная форма). Он отображает возвращаемый HTML в диалоговом окне jquery, а также "повторно прокладывает" представление формы для создания ajax-сообщения содержимого формы (я бы написал контроллер httpPost, такой же, как в предыдущем примере 2). Обратный вызов успеха оценивает ответ и заполняет сообщения об ошибках или закрывает диалог.
- Какой-то другой классный подход, о котором я не думал?
Вариант 1, похоже, больше соответствует "чистым" ASP.NET MVC. Тем не менее, он, как представляется, содержит большие HTTP-нагрузки (поскольку мы отправляем всю страницу обратно в браузер по каждому запросу) и более медленную производительность на стороне сервера (поскольку мы перестраиваем список по каждому запросу).
Вариант 2, похоже, более совместим с более современными веб-приложениями на основе Ajax (меньшими полезными нагрузками HTTP, более подробными операциями). Тем не менее, похоже, что многие контроллеры будут контроллерами JSON, и я буду писать много клиентского кода для маршалирования данных из объектов JSON в/из полей формы, отображения сообщений об ошибках и т.д. Это также похоже на я 'd будет отсутствовать на множестве интересных функций MVC, таких как EditorFor() и ValidationMessageFor(). Он просто "чувствует", как будто я работаю над системой MVC, а не с ней.
[Изменить: добавлена опция 3] Вариант 3 кажется немного гибридным между 1 и 2. Я использую "чистый" подход MVC для создания и заполнения формы и возврата полностью сформированный тег HTML FORM. Возврат HTML к запросу ajax кажется странным, поскольку он настолько подробный, но я могу его преодолеть. Операция post - приятный, компактный JSON, который "чувствует" себя лучше над ajax. Однако, к сожалению, объект полезной нагрузки является FormCollection, а не реальным объектом viewmodel. Похоже, я могу использовать некоторые из удобств MVC (EditorFor()), но не другие (ValidationMessageFor()).
Я ищу "правильный" способ сделать это, а не просто самый быстрый способ взломать его вместе. Да, да, я знаю, что нет универсального "правильного" способа. Но я уверен, что есть некоторые неправильные способы сделать это, и я хочу их избежать.
Я довольно опытна в ASP.NET/C#, но я довольно новичок в MVC. Заранее благодарим за помощь!
[изменить]- выдающиеся ответы - я бы хотел наградить несколько ответов/награды, так как я нашел несколько ответов чрезвычайно полезными. Но, поскольку я не могу, я отмечаю ответ, который считается самым высоким, как ответ. Еще раз спасибо всем респондентам!