2009-04-05 2 views
45

Из того, что я понял, существует большая разница между Html.RenderPartial, включенным в выпуск ASP.NET MVC, и HTML.RenderAction в Microsoft.Web.Mvc.ViewExtensions, включенном в MVC Futures.RenderAction RenderPartial

В моем приложении у меня есть много страниц, составленных из многих «виджетов» (вроде), каждый из которых имеет свою специфическую функцию.

Мне представляется разумнее использовать метод RenderAction, так как каждый виджет будет иметь выделенный контроллер, ответственный за получение разных данных и предоставление выделенного представления (в отличие от того, что только один контроллер и уникальная модель представления пройдут до RenderPartial помощник для визуализации представлений).

Из тестов я сделал, имеющий форму, которая указывает на Создать действие метода в контроллере, как:

<% using (Html.BeginForm("Create", "Message", FormMethod.Post, 
    new { id = "messageCreateForm" })) {%> 

и называя его

<% Html.RenderPartial("MessageForm",new MessageDTO()); %> 

будет оказывать correcly: с

<form id="messageCreateForm" method="post" action="/Message/Create"> 

, но с таким же эквивалентом с RenderAction (поэтому с использованием MessageForm метод действия на контроллере, чтобы сделать вид) не будет оказывать correcly так:

<% Html.RenderAction<MessageController>(m => m.MessageForm()); %> 

будет оказывать в:

<form id="messageCreateForm" method="post" action=""> 

Обратите внимание, что действие пуст.

Правильно ли это использовать помощник RenderAction, и правильно ли использовать его в таких случаях?

ОБНОВЛЕНИЕ: Фактически переименование частичного вида на _MessageForm делает форму корректно.

+1

Я создал статью на эту тему http://prideparrot.com/blog/archive/2012/10/renderpartial_vs__renderaction. Помогите кому-нибудь в этом потоке – VJAI

ответ

75

Очень старый, но он прыгнул в мой список вопросов без ответа :)

Существует большая разница между RenderAction и RenderPartial. RenderPartial будет отображать View на том же контроллере (или совместно используемом), в то время как RenderAction фактически выполнит весь цикл MVC, то есть: он будет создавать экземпляр контроллера (любой контроллер, о котором вы упоминаете, а не только текущий) он выполнит действие, и он вернется и отобразит результат.

RenderPartial больше похож на inclusion, он даже поделится одной и той же моделью, если вы не укажете другую.

RenderAction намного сложнее (и могут быть нежелательные побочные эффекты, поэтому они не сделали эту функцию доступной с версии 1 - изначально она была доступна как экспериментальная функция).

Так что в вашем случае, если у вас есть виджеты, все в порядке использовать оба варианта. Это зависит от сложности виджета. Если у вас есть тот, который должен получить данные из БД, сделать что-то сложное и т. Д., То вы, вероятно, должны использовать RenderAction.

У меня есть диспетчер новостей, ответственный за объекты новостей. Я создал действие «Блок», которое отобразит блок с последними новостями, которые будут помещены на домашнюю страницу. Это прекрасный пример, на мой взгляд, для RenderAction.

+0

Если у вас есть тот, который должен получить данные из БД, сделать что-то сложное и т. Д., То я все еще могу использовать «RenderPartial» по ** только картографическим данным для свойства Model **, проверьте [this] (http://stackoverflow.com/a/17627843/2218697), разве это не лучше для производительности, чем «RenderAction»? – stom

1

Работа с MVC требует большого внимания, чтобы не стрелять в ногу. Я имею в виду это по эффективности продуктов MVC. В сложных проектах я бы предпочел использовать RenderPartial, а не RenderAction. Я использую RenderPartial, в котором я использую запрос jQuery.ajax (с Html.Action). Он определенно работает более эффективно, чем RenderAction. Таким образом, вы можете поместить свои представления в кеш, а затем вызвать jQuery.ajax. Попробуйте сами. Айенде четко объясняет это в Hibernating Rhinos.

Смежные вопросы