2009-07-08 4 views
12

У меня есть представление, состоящее из верхних, левых и нижних заголовков и основного содержимого. Предположим, что во время запроса AJAX мне нужно обновить HTML верхней, нижней и основной панелей (левый заголовок должен оставаться неизменным).ASP.NET MVC и AJAX

Мне было интересно, какой был бы лучший способ достичь этого. Первая мысль заключалась в том, чтобы положить основную панель содержимого в частичную и иметь действие контроллера, которое вернет PartialView. Это не сработает, потому что поскольку действие возвращает только HTML главной панели, я не могу обновить верхний и нижний заголовки.

Поэтому, если я помещаю верхние и нижние заголовки в свои собственные частичные виды, мне понадобится мое действие контроллера, чтобы возвращать несколько частичных представлений. Возможно ли это вообще, или я делаю что-то совершенно не так?

Я видел, что это возможно render a partial view to a string, поэтому я подумал, что могу использовать эту технику в действии, чтобы вернуть объект JSON с 3 свойствами, представляющими HTML из 3 частичных элементов, которые мне нужно обновить. Но это походит на меня совсем неправильно, если возможно вообще.

Еще одна идея, которую я имел, заключалась в том, чтобы вернуть объект JSON, содержащий только данные, необходимые для частичных, и использовать javascript для построения HTML. Но создание пользовательского интерфейса в javascript выглядит сложной задачей (основное содержимое частично использует MvcContrib's GridView с поиском и сортировкой).

Поэтому я был бы очень благодарен за предложения относительно того, что было бы самым чистым подходом к решению такого сценария. Также было бы удобно адаптивное решение: например, если у пользователя есть отключенный javascript, он просто перезагрузит всю страницу без AJAX.


ОБНОВЛЕНИЕ:

Andrew Siemersuggested размещения каждой секции на свой собственный частичный вид и выполнять множество запросов Ajax. Это похоже на совершенно правильный подход, но, к сожалению, он не применим в моем сценарии из-за следующей детали, которую я пропустил в своем первоначальном описании проблемы: верхний заголовок фактически используется для отображения сообщений об ошибках/информации о событиях, происходящих на главной панели. Так, например, мне нужно показать сообщение об ошибке в случае возникновения исключения при извлечении модели для главной панели. Таким образом, только один запрос может быть сделан для обновления этих двух панелей.

+0

могли бы вы взглянуть на это: http://stackoverflow.com/questions/7086440/mvc-validating-binded- to-entitiy-with-reference-to-other-entities pls (не знаю, как с вами связаться напрямую) :) thnx – cpoDesign

ответ

9

Вы можете легко разместить каждый раздел в своем собственном частичном виде. После этого вы сможете сделать запрос jquery для каждого представления после того, как ваши данные будут отправлены/изменены. Затем каждый вызов может быть перенесен в соответствующий раздел. Это очень удобно и звучит как подходящий путь.

Я бы не ожидал, что ваш контроллер вернет несколько частичных представлений ... так как это сломает SRP!

Обновление: после вашего обновления ... вы все равно можете получить разделы отдельно. Это просто требует немного больше удовольствия от аякса с вашей стороны в том, что каждая выборка может вернуть кусок ошибки (посредством запроса JSON). Если возникнет какая-либо ошибка, эти сообщения об ошибках могут отображаться в заголовке. Или ... вы можете сделать запрос заголовка последним для ошибок, как только все остальные запросы будут отправлены обратно, и в этом случае каждое частичное представление может подбросить его сообщения об ошибках в переменную сеанса для состояния ошибки ... и затем показать эти сообщения в заголовок.

Большая причина для выбора в каждом разделе, так как его собственная секция, а не один запрос uber, еще не могут быть очевидны в первоначальном дизайне.Когда каждый раздел контролируется отдельно, вы можете делать такие необычные вещи, как кеширование каждой секции независимо, предоставление более частых обновлений в одной области над другой и т. Д.

+0

Спасибо за отзыв Andrew. К сожалению, я пропустил важную деталь в своем первоначальном описании, поэтому я боюсь, что это предложение не может быть применено в моем сценарии. Я обновил свой вопрос. –

0

Это сложный вопрос. Как насчет этого?

Настройте a partial request для каждого компонента, сверху, слева, основного, каждый из которых возвращает частичный вид с данными, необходимыми для этой области. Затем каждый раз, когда на главной панели происходит событие, начинайте обновлять частичные файлы в каждой области, чтобы обновить их.

В качестве альтернативы можно использовать их на фиксированных таймерах для опроса новых данных.

0

Как насчет включения вашего верхнего и правого вида в скрытые divs на вашем основном экране и перемещения их в правильные места при загрузке?

0

Я знаю, что этот вопрос был дан ответ, но думал, что я просто шаг в предложении:

  • Backbone.js и JQuery шаблонный бы решить ваши проблемы легко.

(Будешь оставить это здесь, как предложение для людей, читающих этот вопрос)