2009-04-05 15 views
45

Von was ich verstanden habe gibt es einen großen Unterschied zwischen der Html.RenderPartial in der ASP.NET MVC-Version und der HTML.RenderAction in der Microsoft.Web.Mvc.ViewExtensions in MVC Futures enthaltenen.RenderAction RenderPartial

Auf meiner Anwendung habe ich viele Seiten aus vielen "Widgets" (Art von) zusammengesetzt, die jeweils ihre eigene spezifische Funktion haben.

Es erschien mir vernünftiger, die Methode RenderAction zu verwenden, da jedes Widget über einen dedizierten Controller verfügt, der für das Abrufen unterschiedlicher Daten und das Rendern einer dedizierten Ansicht zuständig ist (im Gegensatz zu nur einem Controller und einem eindeutigen Anzeigemodell, das an RenderPartial übergeben wird) Helfer zum Rendern von Ansichten).

Aus den Tests, die ich getan habe mit einer Form, die zu einer Aktion erstellen Punkte-Methode in einem Controller wie:

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

und es mit

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

Aufruf machen wird correcly a:

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

aber mit dem gleichen Äquivalent mit RenderAction (also mit einem MessageForm Aktionsmethode auf der Steuerung um die Ansicht zu übertragen) würde so nicht correcly machen:

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

rendert in:

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

Hinweis, dass die Aktion leer ist.

Ist dies der richtige Weg, den RenderAction Helfer zu verwenden und ist es richtig, es in solchen Fällen zu verwenden?

UPDATE: Tatsächlich Umbenennen der Teilansicht in _MessageForm macht das Formular korrekt.

+1

Ich habe einen Beitrag zu diesem Thema hier http://prideparrot.com/blog/archive/2012/10/renderpartial_vs__renderaction erstellt. Wird jemandem helfen, diesen Thread zu besuchen – VJAI

Antwort

75

Sehr alt, aber es sprang in meine Liste der offenen Fragen :)

Es gibt einen großen Unterschied zwischen RenderAction und RenderPartial. RenderPartial wird eine View auf dem gleichen Controller (oder einem gemeinsamen) rendern, während RenderAction tatsächlich einen gesamten Zyklus von MVC durchführen wird, das heißt: es wird den Controller instanziieren (jeder Controller, den Sie erwähnen, nicht nur den aktuellen), es wird die Aktion ausführen, und es wird dann zurückkehren und das Ergebnis rendern.

Die RenderPartial ähnelt eher einer inclusion, sie teilt sogar das gleiche Modell, wenn Sie keine andere angeben.

Die RenderAction ist viel komplexer (und es kann unerwünschte Nebenwirkungen geben, deshalb haben sie diese Funktion seit Version 1 nicht verfügbar gemacht - zunächst war es als experimentelles Feature verfügbar).

Also in Ihrem Fall, wenn Sie Widgets haben, ist es in Ordnung, beide zu verwenden. Es hängt von der Komplexität des Widgets ab. Wenn Sie einen haben, der Daten von einer DB bekommen muss, etwas komplexes tun, usw. ... dann sollten Sie wahrscheinlich RenderAction verwenden.

Ich habe einen News-Controller verantwortlich für Nachrichtenobjekte. Ich habe eine Block-Aktion erstellt, die einen Block mit den neuesten Nachrichten auf der Startseite erscheinen lässt. Dies ist meiner Meinung nach ein perfektes Beispiel für RenderAction.

+0

Wenn Sie einen haben, der Daten von einer DB bekommen muss, machen Sie etwas Komplexes, etc, dann kann ich 'RenderPartial' verwenden ** einfach Daten auf die Model-Eigenschaft abbilden **, [this] überprüfen (http://stackoverflow.com/a/17627843/2218697), Ist das nicht besser für die Leistung als 'RenderAction'? – stom

1

Das Arbeiten mit MVC erfordert viel Aufmerksamkeit, um sich nicht in den Fuß zu schießen. Ich meine es durch die Effizienz der MVC-Produkte. In komplexen Projekten würde ich lieber RenderPartial als RenderAction verwenden. Ich benutze RenderPartial, in dem ich jQuery.ajax Anfrage (mit Html.Action) verwende. Es funktioniert definitiv effizienter als RenderAction. Auf diese Weise können Sie Ihre Ansichten in den Cache stellen und dann jQuery.ajax aufrufen. Probieren Sie es selbst aus. Ayende erklärt es klar in Hibernating Rhinos.

Verwandte Themen