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. Попробуйте сами. Айенде четко объясняет это в "Спящий носорог" .