Was ist der Unterschied (falls vorhanden) zwischen Html.Partial (Ansicht, Modell) und Html.RenderPartial (Ansicht, Modell) in MVC2?

141

Abgesehen von dem Typ, den es zurückgibt, und der Tatsache, dass Sie es natürlich anders nennen

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

Wenn sie unterschiedlich sind, warum würden Sie dann eher einen als den anderen anrufen?
Die Definitionen:

// 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);
    }
}
Stéphane
quelle

Antworten:

168

Der einzige Unterschied besteht darin, dass Partialein zurückgegeben MvcHtmlStringwird und innerhalb aufgerufen werden muss <%= %>, während es direkt in die Ansicht RenderPartialzurückgibt voidund rendert.

Wenn Sie sich den Quellcode ansehen, werden Sie feststellen, dass beide dieselbe interne Methode aufrufen und einen StringWriter zum Rendern übergeben.

Sie würden aufrufen, Partialwenn Sie den generierten HTML-Code anzeigen, speichern oder bearbeiten möchten, anstatt ihn auf die Seite zu schreiben.

SLaks
quelle
Ok, es gibt also keine :) Wie ich dachte, ich kann sie nahtlos verwenden, denke ich. Danke :)
Stéphane
40
Nein, der Unterschied ist der Rückgabetyp, wie SLaks sagte. Dies ist nicht trivial. In Bezug auf die Leistung wurde behauptet, dass das Rendern direkt in den Ausgabestream besser ist (weshalb sie zunächst mit dem nichtigen RenderPartial gearbeitet haben). Partial ist meistens nützlich (imo) beim Testen, obwohl es, wie SLaks sagte, einige Stellen gibt, an denen Sie die Ausgabe bearbeiten möchten, bevor Sie sie im Produktionscode rendern. Sie sind nur selten, imo.
Paul
42
Teilweise ist auch hilfreich, wenn Sie die Ausgabe einer Ansicht in der Steuerung erhalten möchten. Dies kann verwendet werden, um eine Ansicht zum Formatieren einer E-Mail zu verwenden.
Samg
3
@ Paul: Wie viel performanter reden wir? Sind mit den Ansprüchen Tests oder Benchmarks verbunden? Es wäre interessant zu sehen, ob es tatsächlich Fleisch gibt oder ob es nur eine Mikrooptimierung ist.
Chris Pratt
1
Eine Frage, die ich habe, lautet: Beide werden unabhängig davon, welche Sie verwenden, in den Ergebnisstrom gerendert (da in Razor nicht nur das Senden an den TextWriter der gerenderten Ansicht aufgerufen wird), wenn beide dieselbe interne Methode aufrufen, warum Wäre einer performanter als der andere? Liegt es daran, dass es seinen eigenen internen Puffer hochfährt (der sich bei Bedarf schrittweise erweitern würde)? Ich bin auch froh, dass jemand anderes das Ansichtsmodell zum Rendern von E-Mails verwendet hat. Ein anderer Entwickler dachte, ich hätte es
Allen Clark Copeland Jr.
4

Dies ist eine großartige Erklärung von Dino Esposito:

Der Unterschied zwischen den beiden Methoden mag klein und harmlos aussehen, aber er kann Sie beißen, wenn Sie nicht wissen, wie Sie damit umgehen sollen. Der Hauptunterschied zwischen den beiden Methoden ist:

  • Partial Gibt eine HTML-codierte Zeichenfolge zurück
  • RenderPartialist eine void-Methode, die direkt in den Antwortausgabestream schreibt.

Die Verwendung der beiden Methoden unterscheidet sich geringfügig:

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

Die Wahl der Verwendung hängt von Ihren Anforderungen ab. Wenn Sie die in den Antwortstrom eingefügte Zeichenfolge weiter bearbeiten müssen, sollten Sie Folgendes verwenden Partial: ansonsten geh mit RenderPartial was ist - nur weil es direkt zum stream geht - etwas schneller als Partial.

Am Ende fallen die Anwendungsfälle für Teilansichten in eines von zwei Lagern. Das erste ist, wenn Sie eine Ansicht erstellen, indem Sie verschiedene unabhängige Markup-Teile wie unten zusammensetzen.

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

In diesem Fall ändert Ihre Entscheidung bei der Auswahl zwischen RenderPartialoder Partialändert den endgültigen Effekt nicht. Da RenderPartiales jedoch etwas schneller ist, können Sie es vorziehen.

StepUp
quelle
4
-1 Geben Sie beim Kopieren aus einer anderen Quelle mindestens eine Gutschrift an. Dies ist eine offensichtliche Wort-für-Wort-Kopie von Pro ASP.NET MVC 3 Framework (oder zumindest einer neueren Version).
Robotron