2009-09-03 41 views
72

Soy muy nuevo en el desarrollo de aplicaciones web y pensé que comenzaría con la tecnología más reciente, así que estoy tratando de aprender asp.net tan bien como el framework MVC a la vez. Esta es probablemente una pregunta muy simple para ustedes, profesionales de MVC.asp.net acción de controlador de vista parcial MVC

Mi pregunta es si una vista parcial tiene una acción asociada, y si es así, ¿se invoca esta acción cuando una página normal usa RenderPartial() en la vista parcial?

Respuesta

130

Mientras que puede tener una acción que devuelve una vista parcial, no necesita una acción para generar una vista parcial. RenderPartial toma la vista parcial y la representa, utilizando el modelo dado y los datos de vista si se suministran, en la vista actual (principal).

Es posible que desee una acción que devuelva una vista parcial si está utilizando AJAX para cargar/recargar parte de una página. En ese caso, no se desea devolver la vista completa ya que solo desea volver a cargar parte de la página. En este caso, puede hacer que la acción simplemente devuelva la vista parcial que corresponde a esa sección de la página.

mecanismo estándar

Haciendo uso de vista parcial dentro de una vista normal (ninguna acción necesaria)

...some html... 
<% Html.RenderPartial("Partial", Model.PartialModel); %> 
...more html.. 

Ajax mecanismo de

Recarga parte de una página a través de AJAX (nota parcial se representa en línea en la carga de la página inicial)

...some html... 
<div id="partial"> 
<% Html.RenderPartial("Partial", Model.PartialModel); %> 
</div> 
...more html... 

<script type="text/javascript"> 
    $(function() { 
     $('#someButton').click(function() { 
      $.ajax({ 
       url: '/controller/action', 
       data: ...some data for action..., 
       dataType: 'html', 
       success: function(data) { 
       $('#partial').html(data); 
       }, 
       ... 
      }); 
     }); 
    }); 
</script> 

controlador para AJAX

public ActionResult Action(...) 
{ 
    var model = ... 

    ... 

    if (Request.IsAjaxRequest()) 
    { 
      return PartialView("Partial", model.PartialModel); 
    } 
    else 
    { 
      return View(model); 
    } 
} 
+0

Veo, solo estoy jugando con la plantilla VS para una aplicación MVC. Estoy tratando de mostrar múltiples listas de clientes, por ejemplo, dentro de una vista parcial. Actualmente tengo una clase de modelo de transferencia de datos, ¿cómo enviaría este modelo a la vista parcial sin involucrar la vista de página que representa esta vista parcial? ¡Gracias por su ayuda! – yogibear

+1

El parcial siempre se incluye en la vista principal. La única vez que devolvería el parcial por sí solo sería si estuviera actualizando a través de AJAX. Es de suponer que utilizaría un parcial para mostrar ** a ** una lista de clientes. Quizás use un bucle foreach en su vista para iterar sobre las listas (contenidas en el modelo de vista), pasando cada una al parcial como su modelo. – tvanfosson

+0

+1 ¡Muy bien! Buena respuesta. –

3

La respuesta aceptada es completamente correcto, pero quiero añadir que se puede cargar su vista parcial usando jQuery carga. Se necesita menos configuración, si no desea considerar la concurrencia.

$("#Your-Container").load("/controller/action/id"); 
+1

Un consejo es usar Url.Action porque codificar de esta manera la ruta de acceso romperá la aplicación en cambios de ruta o cambios en la estructura del mapa. –

+0

Totalmente de acuerdo contigo @JpHouten. – Saeid

0

La respuesta es no. Pero a veces necesitas alguna acción del controlador detrás de una vista parcial. Luego puede crear un actionMethod que devuelva una vista parcial. Este actionMethod se puede llamar desde otro punto de vista:

@Html.Action("StockWarningsPartial", "Stores") 

El actionmethod puede verse como:

public ActionResult StockWarningsPartial() 
{ 
     ....    
     return View("StockWarningsPartial", warnings); 

} 

y la vista se inicia 'StockWarningsPartial.cshtml' con:

@{ 
    Layout = null; 
} 

para que sea no renderizar su diseño circundante de nuevo.

1

Pude lograr algo similar con esta lógica.

Dentro del .cshtml

@Html.Action("ActionMethodName", "ControllerName"); 

dentro del controlador

[Route("some-action")] 
public ActionResult ActionMethodName() 
{ 
    var someModel = new SomeModel(); 
    ... 
    return PartialView("SomeView.cshtml", someModel); 
} 

Y eso es todo.

Si necesita pasar valores de .cshtml al método de acción, entonces eso es posible.

+1

Ejemplo perfecto. Mostraste la interacción y el código tanto en el controlador como en la vista de una manera limpia y clara hasta el punto. Sin pelusa. Gracias. – eaglei22

Cuestiones relacionadas