Qual è la differenza (se presente) tra Html.Partial (vista, modello) e Html.RenderPartial (vista, modello) in MVC2?


141

A parte il tipo che restituisce e il fatto che tu lo chiami in modo diverso ovviamente

<% Html.RenderPartial(...); %>
<%= Html.Partial(...) %>  

Se sono diversi, perché dovresti chiamarne uno anziché l'altro?
Le definizioni:

// Type: System.Web.Mvc.Html.RenderPartialExtensions
// Assembly: System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// Assembly location: C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 2\Assemblies\System.Web.Mvc.dll

using System.Web.Mvc;

namespace System.Web.Mvc.Html
{
    public static class RenderPartialExtensions
    {
        public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName);
        public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName, ViewDataDictionary viewData);
        public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName, object model);

        public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName, object model,
                                     ViewDataDictionary viewData);
    }
}

// Type: System.Web.Mvc.Html.PartialExtensions
// Assembly: System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// Assembly location: C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 2\Assemblies\System.Web.Mvc.dll

using System.Web.Mvc;

namespace System.Web.Mvc.Html
{
    public static class PartialExtensions
    {
        public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName);

        public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName,
                                        ViewDataDictionary viewData);

        public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, object model);

        public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, object model,
                                        ViewDataDictionary viewData);
    }
}

Risposte:


168

L'unica differenza è che Partialrestituisce un MvcHtmlString, e deve essere chiamato all'interno <%= %>, mentre RenderPartialritorna voide rende direttamente alla vista.

Se guardi il codice sorgente , vedrai che entrambi chiamano lo stesso metodo interno, passando a StringWriter per il rendering.

Si chiamerebbe Partialse si desidera visualizzare, salvare o manipolare l'HTML generato invece di scriverlo nella pagina.


Ok, quindi non ce n'è :) come pensavo, posso usarli senza problemi immagino. Grazie :)
Stéphane,

40
no, la differenza è il tipo restituito, come ha detto SLaks. Questo non è banale. Per quanto riguarda le prestazioni, è stato affermato che il rendering direttamente nel flusso di output è migliore (motivo per cui sono andati con il RenderPartial vuoto per cominciare). Parziale è principalmente utile (imo) nei test, anche se come ha detto SLaks potrebbero esserci dei punti in cui si desidera manipolare l'output prima di renderlo nel codice di produzione. Sono solo rari, imo.
Paul,

42
Parziale è utile anche quando si desidera ottenere l'output di una vista nel controller. Questo può essere usato per usare una vista per formattare un'e-mail.
Samg,

3
@Paul: quanto più performanti stiamo parlando? I reclami hanno dei test o dei benchmark associati? Sarebbe interessante vedere se c'è davvero carne in questo o se è solo una micro-ottimizzazione.
Chris Pratt,

1
Una domanda che ho è: entrambi finirebbero per essere renderizzati nel flusso di risultati indipendentemente da quale si usi (poiché in Razor non lo si chiama semplicemente inviandolo al TextWriter della vista renderizzata), se entrambi chiamano lo stesso metodo interno, perché uno sarebbe più performante dell'altro? È dovuto alla sua rotazione del proprio buffer interno (che si espanderebbe progressivamente secondo necessità)? Inoltre sono contento che qualcun altro abbia visto l'uso per utilizzare il modello di visualizzazione per il rendering di e-mail; un altro sviluppatore pensava che lo stessi facendo troppo, ma è più pulito e più facile da manipolare di una corda in cui devi sfuggire a tutto.
Allen Clark Copeland Jr

4

Questa è una grande spiegazione di Dino Esposito:

La differenza tra i due metodi può sembrare piccola e innocua, ma potrebbe morderti se non sai come gestirlo. La differenza chiave tra i due metodi è:

  • Partial restituisce una stringa con codifica HTML
  • RenderPartialè un metodo nullo che scrive direttamente nel flusso di output della risposta.

L'uso dei due metodi è leggermente diverso:

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

La scelta di quale utilizzare dipende dalle vostre esigenze. Se è necessario manipolare ulteriormente la stringa che viene iniettata nel flusso di risposta, è necessario utilizzare Partial; altrimenti andare con RenderPartial quale è - solo perché va direttamente allo stream - un po 'più veloce di Partial.

Alla fine, i casi d'uso per le viste parziali rientrano in uno dei due campi. Il primo è quando crei una vista componendo insieme vari pezzi indipendenti di markup, come di seguito.

<body>
    @{ Html.RenderPartial("_Header"); }
    @Html.Partial("_Sidebar")
    <div class="container body-content">
       @RenderBody()
    </div>
    @{ Html.RenderPartial("_Footer"); }
</body>

In questo caso, la tua decisione di scegliere tra RenderPartialo Partialnon modifica l'effetto finale. Tuttavia, poiché RenderPartialè leggermente più veloce, potresti preferire usarlo.


4
-1 Quando si copia da un'altra fonte, almeno dare credito. Questa è una palese copia per parola da Pro ASP.NET MVC 3 Framework (o almeno una versione più recente).
Robotron,
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.