Html.Partial vs Html.RenderPartial & Html.Action vs Html.RenderAction


Risposte:


1237

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.


71
Sai perché dovresti usarne uno sopra l'altro?
Jason,

156
dal punto di vista delle prestazioni è meglio usare RenderPartial, come indicato qui: stackoverflow.com/questions/2729815/…
Vlad Iliescu,

13
Grazie per il bit sulla memorizzazione del risultato in una variabile. Questo è il motivo per usare Parziale o Azione sulla controparte Render.
David Kassa,

8
Html.Partial()è stato creato per avere una sintassi più fluida con Razor. Come ha detto @Vlad, Html.RenderPartial()è più efficiente.
Tsahi Asher,

2
@Tsahi spiega perché viene utilizzato nel modello di progetto MVC per _LoginPartial. Grazie.
regularmike,

86

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);
}

3
Stai dicendo che Html.Partial ha prestazioni migliori di Html.RenderPartial?
numaroth,

15
Sì e no, Html.Partial è reso in linea e richiede meno risorse ma richiede più tempo. Html.RenderPartial è reso separatamente e quindi più veloce, ma richiede più risorse. Se si dispone di traffico a raffica ad alto volume favorire Html.Partial per ridurre l'utilizzo delle risorse. In caso di modifiche non frequenti al volume del traffico, favorire Html.RenderPartial.
Brett Jones,

4
A mio avviso, è il contrario: RenderPartial ha sicuramente prestazioni migliori in quanto scrive direttamente nel flusso di output. Parziale chiama internamente lo stesso metodo, ma scrive in StringWriter che viene restituito come MvcHtmlString e infine scritto nel flusso di output. Pertanto alloca molta più memoria.
slfan

2
@BrettJones Che cosa intendi con "risorse intensive"? Solo perché il 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".
Dai

57

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.


2
Rispondere (perché?) È la risposta migliore, quindi questa è la cosa migliore per me.
YEH,

55

La differenza è che il primo restituisce un output MvcHtmlStringma second ( Render..) direttamente alla risposta.


MvcHtmlString non verrebbe aggiunto anche alla risposta?
Shad

21

Secondo me @Html.RenderPartial()ha un'esecuzione più rapida di quella @Html.Partial()dovuta a Html.RenderPartial fornisce una risposta rapida all'output.

Perché quando uso @Html.Partial(), il mio sito web impiega più tempo a caricarsi rispetto a @Html.RenderPartial()


21

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


3
Buona risposta, perché spieghi anche quando usare Partial over Action
raklos,

15

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


9

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


Come posso farlo con Html.RenderPartial?
xatz,

1
non possiamo usare Html.RenderPartial perché il suo tipo restituito è nullo
Namrata Jain,

9

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.


8

differenze:

  1. Il tipo di ritorno di RenderPartialè void, dove come PartialritornaMvcHtmlString

  2. Sintassi per invocazione Partial()e RenderPartial()metodi nelle viste Razor

    @ Html.Partial ("PartialViewName")
    @ {Html.RenderPartial ("PartialViewName"); }

  3. 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().


5

Html.Partial: ritorna MvcHtmlStringe lento

Html.RenderPartial: esegue direttamente il rendering / scrittura sul flusso di output e ritorna voided è molto veloce rispetto aHtml.Partial


3

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"


2

@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();
 }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.