72

Sono molto nuovo allo sviluppo di app Web e ho pensato di iniziare con la tecnologia recente e quindi sto cercando di imparare asp.net così come il framework MVC in una volta. Questa è probabilmente una domanda molto semplice per voi, professionisti MVC.asp.net MVC vista parziale azione del controllore

La mia domanda è se una vista parziale ha un'azione associata e, in caso affermativo, questa azione viene richiamata ogni volta che una pagina normale utilizza RenderPartial() nella vista parziale?

risposta

130

Mentre è possibile eseguire un'azione che restituisce una vista parziale, non è necessario eseguire un'azione per il rendering di una vista parziale. RenderPartial acquisisce la vista parziale e la esegue, utilizzando il modello specificato e visualizza i dati, se forniti, nella vista corrente (principale).

Si potrebbe desiderare un'azione che restituisce una vista parziale se si utilizza AJAX per caricare/ricaricare parte di una pagina. In tal caso, non è necessario restituire la vista completa poiché si desidera ricaricare solo una parte della pagina. In questo caso puoi fare in modo che l'azione restituisca solo la vista parziale corrispondente a quella sezione della pagina.

meccanismo standard

Facendo uso di vista parziale in una vista normale (nessuna azione necessaria)

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

Ajax meccanismo

ricaricamento parte di una pagina mediante AJAX (nota parziale viene reso in linea nel caricamento iniziale della pagina)

...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> 

Controller per AJAX

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

    ... 

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

vedo, sto solo giocando con il modello VS per un app MVC. Sto cercando di visualizzare più elenchi di client, ad esempio, in una vista parziale. Al momento ho una classe di modello di trasferimento di dati, come potrei inviare questo modello per la vista parziale senza coinvolgere la visualizzazione della pagina che rende questa visione parziale? Grazie per il tuo aiuto! – yogibear

+1

Il partial è sempre incluso nella vista principale. L'unica volta in cui restituiresti il ​​partial da solo sarebbe se tu eseguissi l'aggiornamento tramite AJAX. Presumibilmente useresti un partial per visualizzare ** un ** elenco di client. Si potrebbe, forse, utilizzare un ciclo foreach in immagine per scorrere i liste (contenuti nel modello di vista), passando ciascuno alla parziale come modello. – tvanfosson

+0

+1 Molto bene! Bella risposta. –

3

La risposta accettata è del tutto corretto, ma voglio aggiungere che è possibile caricare la vostra visione parziale con carico jQuery. Meno configurazione necessaria, se non si desidera considerare la concorrenza.

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

Un consiglio è quello di utilizzare Url.Action perché hardcoding il percorso come questo si romperà l'applicazione su cambiamenti di rotta o modifiche mappa della struttura. –

+0

Totalmente d'accordo con te @JpHouten. – Saeid

0

la risposta è no. Ma a volte hai bisogno di qualche azione del controller dietro una vista parziale. Quindi puoi creare un'azioneMetodo che restituisce una vista parziale. Questo actionMethod può essere chiamato in un altro vista:

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

L'actionmethod può apparire come:

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

} 

e la vista inizia 'StockWarningsPartial.cshtml' con:

@{ 
    Layout = null; 
} 

per renderlo non rendere nuovamente il layout circostante.

1

Sono riuscito a ottenere qualcosa di simile con questa logica.

All'interno del .cshtml

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

all'interno del controller

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

E questo è tutto.

Se è necessario passare i valori dalla .cshtml al metodo di azione allora che è possibile.

+1

Esempio perfetto. Hai mostrato l'interazione e il codice sia nel controller che nella vista in modo chiaro e pulito al punto. Senza la peluria. Grazie. – eaglei22