In ASP.NET MVC, qual è la differenza tra:
Html.PartialeHtml.RenderPartialHtml.ActioneHtml.RenderAction
In ASP.NET MVC, qual è la differenza tra:
Html.Partial e Html.RenderPartialHtml.Action e Html.RenderActionRisposte:
Html.Partialrestituisce una stringa. Html.RenderPartialchiama Writeinternamente 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.Partialin una variabile o restituirlo da un metodo, non è possibile farlo con Html.RenderPartial.
Il risultato verrà scritto nel Responseflusso durante l'esecuzione / valutazione.
Questo vale anche per Html.Actione 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);
}
Partialrendering 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.Partiale @Html.RenderPartialvengono utilizzati quando il modello della vista parziale corrisponde al modello principale, non è necessario creare alcun metodo di azione per chiamarlo.
@Html.Actione @Html.RenderActionvengono 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è voidche 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.PartialeHtml.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 PartialritornaMvcHtmlString
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.Partialritorna vista nella stringa codificata HTML e usa lo stesso TextWriteroggetto vista .
@Html.RenderPartialquesto metodo restituisce void.
@Html.RenderPartialè più veloce di@Html.Partial
La sintassi per PartialView:
[HttpGet]
public ActionResult AnyActionMethod
{
return PartialView();
}