2009-04-05 20 views
45

Por lo que he entendido, hay una gran diferencia entre el Html.RenderPartial incluido en el lanzamiento ASP.NET MVC y el HTML.RenderAction en el Microsoft.Web.Mvc.ViewExtensions incluido en MVC Futures.RenderAction RenderPartial

En mi aplicación tengo muchas páginas compuestas de muchos "widgets" (más o menos) que tienen su propia función específica.

Me pareció más razonable usar el método RenderAction ya que cada widget tendría un controlador dedicado para obtener datos diferentes y representar una vista dedicada (en lugar de tener un solo controlador y un modelo de vista único para pasar al RenderPartial ayudante para renderizar vistas).

De las pruebas que he hecho con una forma que apunta a un método Create acción en un controlador como:

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

y llamándolo con

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

hará que correcly a:

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

pero con el mismo equivalente con RenderAction (entonces usando un MessageForm método de acción en el controlador para renderizar la vista) no haría correcly manera:

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

rendirá en:

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

Tenga en cuenta que la acción está vacía.

¿Es esta la manera correcta de usar el ayudante RenderAction y es correcto usarlo en casos como ese?

ACTUALIZACIÓN: En realidad, el cambio de nombre de la vista parcial a _MessageForm representa el formulario de forma correcta.

+1

Creé una publicación sobre este tema aquí http://prideparrot.com/blog/archive/2012/10/renderpartial_vs__renderaction. Ayudará a alguien a visitar este hilo – VJAI

Respuesta

75

uno muy viejo, pero se metió en mi lista de preguntas sin respuesta :)

Hay una gran diferencia entre RenderAction y RenderPartial. RenderPartial representará View en el mismo controlador (o uno compartido), mientras que RenderAction realmente realizará un ciclo completo de MVC, es decir: creará una instancia del controlador (cualquier controlador que mencione, no solo el actual), ejecutará la acción, y luego regresará y presentará el resultado.

El RenderPartial es más similar a un inclusion, incluso compartirá el mismo modelo si no especifica uno diferente.

RenderAction es mucho más complejo (y puede haber efectos secundarios no deseados, es por eso que no hicieron esta función disponible desde la versión 1 - inicialmente estaba disponible como una función experimental).

Por lo tanto, en su caso, si tiene widgets, está bien usar ambos. Depende de la complejidad del widget. Si tiene uno que tiene que obtener datos de un DB, hacer algo complejo, etc. ... entonces probablemente debería usar RenderAction.

Tengo un controlador de noticias responsable de objetos de noticias. Creé una acción de bloqueo, que representará un bloque con las últimas noticias para poner en la página de inicio. Este es un ejemplo perfecto, en mi opinión, para RenderAction.

+0

Si tiene uno que tiene que obtener datos de un DB, hacer algo complejo, etc. entonces aún puedo usar 'RenderPartial' con ** solo asignar datos a la propiedad del modelo **, verificar [esto] (http://stackoverflow.com/a/17627843/2218697), ¿no es mejor para el rendimiento que 'RenderAction'? – stom

1

Trabajar con MVC requiere mucha atención para no dispararse en el pie. Lo digo por la eficiencia de los productos MVC. En proyectos complejos, preferiría usar RenderPartial en lugar de RenderAction. Uso RenderPartial en el que utilizo la solicitud jQuery.ajax (con Html.Action). Definitivamente funciona de manera más eficiente que RenderAction. De esta forma, puede poner sus Vistas en el caché y luego llamar a jQuery.ajax. Pruébenlo ustedes mismos. Ayende lo explica claramente en Hibernating Rhinos.

Cuestiones relacionadas