In ASP.NET MVC, qual è la differenza tra:
Html.Partial
eHtml.RenderPartial
Html.Action
eHtml.RenderAction
In ASP.NET MVC, qual è la differenza tra:
Html.Partial
e Html.RenderPartial
Html.Action
e Html.RenderAction
Risposte:
Html.Partial
restituisce una stringa. Html.RenderPartial
chiama Write
internamente e ritorna void
.
L'utilizzo di base è:
// Razor syntax
@Html.Partial("ViewName")
@{ Html.RenderPartial("ViewName"); }
// WebView syntax
<%: Html.Partial("ViewName") %>
<% Html.RenderPartial("ViewName"); %>
Nel frammento sopra, entrambe le chiamate produrranno lo stesso risultato.
Mentre è possibile memorizzare l'output di Html.Partial
in una variabile o restituirlo da un metodo, non è possibile farlo con Html.RenderPartial
.
Il risultato verrà scritto nel Response
flusso durante l'esecuzione / valutazione.
Questo vale anche per Html.Action
e Html.RenderAction
.
Html.Partial()
è stato creato per avere una sintassi più fluida con Razor. Come ha detto @Vlad, Html.RenderPartial()
è più efficiente.
Pensa a @ Html.Partial come codice HTML copiato nella pagina padre. Pensa a @ Html.RenderPartial come a un controllo utente .ascx incorporato nella pagina padre. Un controllo utente .ascx ha un sovraccarico molto maggiore.
'@ Html.Partial' restituisce una stringa codificata html che viene costruita in linea con il genitore. Accede al modello del genitore.
'@ Html.RenderPartial' restituisce l'equivalente di un controllo utente .ascx. Ottiene la propria copia del ViewDataDictionary della pagina e le modifiche apportate al ViewData di RenderPartial non influiscono sul ViewData del genitore.
Usando la riflessione troviamo:
public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, object model, ViewDataDictionary viewData)
{
MvcHtmlString mvcHtmlString;
using (StringWriter stringWriter = new StringWriter(CultureInfo.CurrentCulture))
{
htmlHelper.RenderPartialInternal(partialViewName, viewData, model, stringWriter, ViewEngines.Engines);
mvcHtmlString = MvcHtmlString.Create(stringWriter.ToString());
}
return mvcHtmlString;
}
public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName)
{
htmlHelper.RenderPartialInternal(partialViewName, htmlHelper.ViewData, null, htmlHelper.ViewContext.Writer, ViewEngines.Engines);
}
Partial
rendering in un buffer non significa che sia reso in modo asincrono - anzi il contrario - non riesco a vedere come si possa affermare che RenderPartial
" richiede più risorse".
Ecco cosa ho trovato:
Usa RenderAction quando non hai un modello da inviare alla vista e hai molto HTML da riportare che non ha bisogno di essere archiviato in una variabile.
Usa Action quando non hai un modello da inviare alla vista e hai un po 'di testo da riportare che deve essere archiviato in una variabile.
Usa RenderPartial quando hai un modello da inviare alla vista e ci sarà un sacco di HTML che non deve essere archiviato in una variabile.
Usa Parziale quando hai un modello da inviare alla vista e ci sarà un po 'di testo che deve essere memorizzato in una variabile.
RenderAction e RenderPartial sono più veloci.
@Html.Partial
e @Html.RenderPartial
vengono utilizzati quando il modello della vista parziale corrisponde al modello principale, non è necessario creare alcun metodo di azione per chiamarlo.
@Html.Action
e @Html.RenderAction
vengono utilizzati quando il modello di vista parziale è indipendente dal modello principale, fondamentalmente viene utilizzato quando si desidera visualizzare qualsiasi contenuto di tipo widget nella pagina. È necessario creare un metodo di azione che restituisca un risultato della vista parziale mentre si chiama il metodo dalla vista.
Maggiori informazioni sulla domanda:
"Quando Html.RenderPartial () viene chiamato solo con il nome della vista parziale, ASP.NET MVC passerà alla vista parziale gli stessi oggetti del dizionario Model e ViewData utilizzati dal modello della vista chiamante."
"NerdDinner" da Professional ASP.NET MVC 1.0
Il tipo restituito di Html.RenderAction
è void
che significa che esegue il rendering diretto delle risposte in Visualizza in cui il tipo restituito Html.Action
è MvcHtmlString
È possibile catturare la vista di rendering nel controller e modificarla utilizzando il seguente metodo
protected string RenderPartialViewToString(string viewName, object model)
{
if (string.IsNullOrEmpty(viewName))
viewName = ControllerContext.RouteData.GetRequiredString("action");
ViewData.Model = model;
using (StringWriter sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
Ciò restituirà la stringa HTML della vista.
Questo è applicabile anche a Html.Partial
eHtml.RenderPartial
Parziale o RenderPartial: non è necessario creare un metodo di azione. utilizzare quando i dati da visualizzare nella vista parziale sono già presenti nel modello della pagina corrente.
Azione o azione di rendering: richiede un metodo di azione figlio. utilizzare quando i dati da visualizzare nella vista hanno un modello indipendente.
differenze:
Il tipo di ritorno di RenderPartial
è void
, dove come Partial
ritornaMvcHtmlString
Sintassi per invocazione Partial()
e RenderPartial()
metodi nelle viste Razor
@ Html.Partial ("PartialViewName")
@ {Html.RenderPartial ("PartialViewName"); }
Sintassi per invocazione Partial()
e RenderPartial()
metodi nelle viste webform
[%: Html.Partial ("PartialViewName")%]
[% Html.RenderPartial ("PartialViewName"); %]
Di seguito sono le 2 domande di intervista comuni relativi alla Partial()
e RenderPartial()
cui si deve utilizzare Partial()
sopra RenderPartial()
e viceversa?
La differenza principale è che RenderPartial()
restituisce null e l'output verrà scritto direttamente nel flusso di output, dove al Partial()
ritorno del metodo MvcHtmlString
, che può essere assegnato a una variabile e manipolarlo se necessario. Quindi, quando è necessario assegnare l'output a una variabile per manipolarlo, quindi utilizzare Partial (), altrimenti utilizzare RenderPartial ().
Quale è meglio per le prestazioni?
Dal punto di vista delle prestazioni, è meglio eseguire il rendering direttamente nel flusso di output. RenderPartial()
fa esattamente la stessa cosa ed è migliore per le prestazioni Partial()
.
Per "parziale" lo uso sempre come segue:
Se c'è qualcosa che devi includere in una pagina che devi passare tramite il controller (come faresti con una chiamata Ajax), usa "Html.RenderPartial".
Se hai un'inclusione 'statica' che non è collegata a un controller di per sé e solo nella cartella 'condivisa', ad esempio, usa "HTML.partial"
@Html.Partial
ritorna vista nella stringa codificata HTML e usa lo stesso TextWriter
oggetto vista .
@Html.RenderPartial
questo metodo restituisce void
.
@Html.RenderPartial
è più veloce di@Html.Partial
La sintassi per PartialView
:
[HttpGet]
public ActionResult AnyActionMethod
{
return PartialView();
}