RenderAction RenderPartial
Из того, что я понял, существует большая разница между Html.RenderPartial
, включенным в выпуск ASP.NET MVC, и HTML.RenderAction
в Microsoft.Web.Mvc.ViewExtensions
, включенном в MVC Futures.
В моем приложении у меня много страниц, состоящих из многих "виджетов" (вроде), каждый из которых имеет свою собственную определенную функцию.
Мне показалось разумнее использовать метод RenderAction
, так как каждый виджет будет иметь выделенный контроллер, ответственный за получение разных данных и предоставление выделенного представления (в отличие от того, чтобы иметь только один контроллер и уникальную модель представления RenderPartial
помощник для визуализации представлений).
Из тестов, которые я сделал, имеет форму, которая указывает на метод Create action в контроллере, например:
<% using (Html.BeginForm("Create", "Message", FormMethod.Post,
new { id = "messageCreateForm" })) {%>
и называя его
<% Html.RenderPartial("MessageForm",new MessageDTO()); %>
будет выглядеть корректно a:
<form id="messageCreateForm" method="post" action="/Message/Create">
но с тем же эквивалентом с RenderAction
(поэтому использование метода действия MessageForm
на контроллере для визуализации представления) не будет отображаться соответствующим образом:
<% Html.RenderAction<MessageController>(m => m.MessageForm()); %>
будет отображаться в:
<form id="messageCreateForm" method="post" action="">
Обратите внимание, что действие пуст.
Правильно ли это использовать помощник RenderAction
и правильно ли использовать его в таких случаях?
UPDATE:
Фактически переименование частичного представления на _MessageForm делает форму корректно.
Ответы
Ответ 1
Очень старый, но он вскочил в мой список оставшихся без ответа вопросов:)
Существует большая разница между RenderAction
и RenderPartial
. RenderPartial
будет отображать View
на том же контроллере (или совместно используемом), а RenderAction
будет фактически выполнять весь цикл MVC, то есть: он будет создавать экземпляр контроллера (любой контроллер, о котором вы упоминаете, а не только текущий), он выполнит действие, и он вернется и отобразит результат.
RenderPartial
больше похож на inclusion
, он даже будет использовать одну и ту же модель, если вы не укажете другую.
RenderAction
намного сложнее (и могут быть нежелательные побочные эффекты, поэтому они не сделали эту функцию доступной с версии 1 - изначально она была доступна как экспериментальная функция).
Итак, в вашем случае, если у вас есть виджеты, это нормально использовать оба. Это зависит от сложности виджета. Если у вас есть тот, который должен получить данные из БД, сделать что-то сложное и т.д.... тогда вы, вероятно, должны использовать RenderAction
.
У меня есть диспетчер новостей, отвечающий за объекты новостей. Я создал действие "Блок", которое отобразит блок с последними новостями, которые будут помещены на домашнюю страницу. Это прекрасный пример, на мой взгляд, для RenderAction.
Ответ 2
Работа с MVC требует большого внимания, чтобы не стрелять в ногу. Я имею в виду это по эффективности продуктов MVC. В сложных проектах я бы предпочел использовать RenderPartial, а не RenderAction. Я использую RenderPartial, в котором я использую запрос jQuery.ajax(с Html.Action). Он определенно работает более эффективно, чем RenderAction. Таким образом, вы можете поместить свои представления в кеш, а затем вызвать jQuery.ajax. Попробуйте сами.
Айенде четко объясняет это в "Спящий носорог" .