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

Antworten:

1237

Html.Partialgibt einen String zurück. Html.RenderPartialruft Writeintern an und kehrt zurück void.

Die grundlegende Verwendung ist:

// Razor syntax
@Html.Partial("ViewName")
@{ Html.RenderPartial("ViewName");  }

// WebView syntax
<%: Html.Partial("ViewName") %>
<% Html.RenderPartial("ViewName"); %>

Im obigen Snippet führen beide Aufrufe zum gleichen Ergebnis.

Während man die Ausgabe von Html.Partialin einer Variablen speichern oder von einer Methode zurückgeben kann, kann man dies nicht mit tun Html.RenderPartial.

Das Ergebnis wird Responsewährend der Ausführung / Auswertung in den Stream geschrieben .

Dies gilt auch für Html.Actionund Html.RenderAction.

GvS
quelle
71
Wissen Sie, warum Sie eins über das andere verwenden würden?
Jason
156
In Bezug auf die Leistung ist es besser, RenderPartial zu verwenden, wie hier beantwortet: stackoverflow.com/questions/2729815/…
Vlad Iliescu
13
Vielen Dank für das bisschen über das Speichern des Ergebnisses in einer Variablen. Dies ist der Grund, Partial oder Action über das Render-Gegenstück zu verwenden.
David Kassa
8
Html.Partial()wurde entwickelt, um eine flüssigere Syntax mit Razor zu haben. Wie @Vlad sagte, Html.RenderPartial()ist effizienter.
Tsahi Asher
2
@Tsahi, das erklärt, warum es in der MVC-Projektvorlage für _LoginPartial verwendet wird. Vielen Dank.
Regularmike
86

Stellen Sie sich @ Html.Partial als HTML-Code vor, der auf die übergeordnete Seite kopiert wird. Stellen Sie sich @ Html.RenderPartial als ein .ascx-Benutzersteuerelement vor, das in die übergeordnete Seite integriert ist. Ein .ascx-Benutzersteuerelement hat weitaus mehr Overhead.

'@ Html.Partial' gibt eine HTML-codierte Zeichenfolge zurück, die inline mit dem übergeordneten Zeichen erstellt wird . Es greift auf das Modell des Elternteils zu.

'@ Html.RenderPartial' gibt das Äquivalent eines .ascx-Benutzersteuerelements zurück. Es erhält eine eigene Kopie des ViewDataDictionary der Seite, und Änderungen an den ViewData des RenderPartials wirken sich nicht auf die ViewData des übergeordneten Elements aus.

Mit Reflexion finden wir:

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);
}
Brett Jones
quelle
3
Wollen Sie damit sagen, dass Html.Partial eine bessere Leistung als Html.RenderPartial hat?
Numaroth
15
Ja und nein, Html.Partial wird inline gerendert und ist weniger ressourcenintensiv, aber zeitaufwändiger. Html.RenderPartial wird separat gerendert und ist daher schneller, aber ressourcenintensiver. Wenn Sie ein hohes Volumen an Burst-Verkehr haben, bevorzugen Sie Html.Partial, um die Ressourcennutzung zu reduzieren. Wenn Sie selten Änderungen im Verkehrsaufkommen haben, bevorzugen Sie Html.RenderPartial.
Brett Jones
4
Meiner Meinung nach ist es umgekehrt: RenderPartial hat definitiv eine bessere Leistung, da es direkt in den Ausgabestream schreibt. Partial ruft intern dieselbe Methode auf, schreibt jedoch in einen StringWriter, der als MvcHtmlString zurückgegeben und schließlich in den Ausgabestream geschrieben wird. Daher wird viel mehr Speicher zugewiesen.
Slfan
2
@BrettJones Was meinst du mit "ressourcenintensiv"? Nur weil das PartialRendern in einen Puffer nicht bedeutet, dass es asynchron gerendert wird - im Gegenteil -, kann ich nicht sehen, wie Sie behaupten können, RenderPartial"ressourcenintensiver" zu sein.
Dai
57

Folgendes habe ich gefunden:

Verwenden Sie RenderAction, wenn Sie kein Modell zum Senden an die Ansicht haben und viel HTML zurückbringen müssen, das nicht in einer Variablen gespeichert werden muss.

Verwenden Sie Aktion, wenn Sie kein Modell zum Senden an die Ansicht haben und ein wenig Text zurückbringen möchten, der in einer Variablen gespeichert werden muss.

Verwenden Sie RenderPartial, wenn Sie ein Modell an die Ansicht senden möchten und es viele HTML- Dateien gibt, die nicht in einer Variablen gespeichert werden müssen.

Verwenden Sie Partial, wenn Sie ein Modell an die Ansicht senden möchten und ein wenig Text in einer Variablen gespeichert werden muss.

RenderAction und RenderPartial sind schneller.

David
quelle
2
Antworten (warum?) Ist die beste Antwort, daher ist dies das Beste für mich.
YEH
55

Der Unterschied besteht darin, dass der erste eine MvcHtmlStringzweite ( Render..) Ausgabe direkt an die Antwort zurückgibt .

Aliostad
quelle
würde MvcHtmlString nicht auch zur Antwort hinzugefügt werden?
Shad
21

Laut mir @Html.RenderPartial()hat die Ausführung schneller als @Html.Partial()aufgrund von Html.RenderPartial gibt eine schnelle Antwort auf die Ausgabe.

Denn wenn ich @Html.Partial()meine Website benutze , dauert das Laden länger als im Vergleich zu @Html.RenderPartial()

iChirag
quelle
21

@Html.Partialund @Html.RenderPartialwerden verwendet, wenn Ihr Teilansichtsmodell der Entsprechung des übergeordneten Modells entspricht. Wir müssen keine Aktionsmethode erstellen, um dies aufzurufen.

@Html.Actionund @Html.RenderActionwerden verwendet, wenn Ihr Teilansichtsmodell vom übergeordneten Modell unabhängig ist. Grundsätzlich wird es verwendet, wenn Sie Inhalte vom Typ Widget auf einer Seite anzeigen möchten. Sie müssen eine Aktionsmethode erstellen, die beim Aufrufen der Methode aus der Ansicht ein Teilansichtsergebnis zurückgibt.

Jayesh Patel
quelle
3
Gute Antwort, weil Sie auch erklären, wann Partial over Action
Raklos
15

Mehr zur Frage:

"Wenn Html.RenderPartial () nur mit dem Namen der Teilansicht aufgerufen wird, übergibt ASP.NET MVC an die Teilansicht dieselben Model- und ViewData-Wörterbuchobjekte, die von der aufrufenden Ansichtsvorlage verwendet werden."

"NerdDinner" von Professional ASP.NET MVC 1.0

Ygor Thomaz
quelle
9

Der Rückgabetyp Html.RenderActionist , voiddass Mittel direkt die Antworten in Ansicht rendert , wo der Rückgabetyp Html.Actionsind MvcHtmlStringSie können ihre Render - Ansicht in der Steuerung fangen und ändern Sie es durch folgende Verfahren unter Verwendung von

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

Dies gibt die HTML-Zeichenfolge der Ansicht zurück.

Dies gilt auch für Html.PartialundHtml.RenderPartial

Shivkumar
quelle
Wie kann ich das mit Html.RenderPartial machen?
Xatz
1
Wir können Html.RenderPartial nicht verwenden, da sein Rückgabetyp ungültig ist
Namrata Jain
9

Partial oder RenderPartial: Es muss keine Aktionsmethode erstellt werden. Verwenden Sie diese Option, wenn Daten, die in der Teilansicht angezeigt werden sollen, bereits im Modell der aktuellen Seite vorhanden sind.

Aktion oder RenderAction: Erfordert eine untergeordnete Aktionsmethode. Verwenden Sie diese Option, wenn die in der Ansicht anzuzeigenden Daten ein unabhängiges Modell haben.

Anil
quelle
8

Unterschiede:

  1. Der Rückgabetyp von RenderPartialist void, wobei als PartialRückgabeMvcHtmlString

  2. Syntax zum Aufrufen Partial()und RenderPartial()Methoden in Razor-Ansichten

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

  3. Syntax zum Aufrufen Partial()und RenderPartial()Methoden in Webformularansichten

[%: Html.Partial ("PartialViewName")%]
[% Html.RenderPartial ("PartialViewName"); %]

Im Folgenden sind die zwei gemeinsamen Interview Fragen zu Partial()und RenderPartial() Wann möchten Sie verwenden Partial()über RenderPartial()und umgekehrt?

Der Hauptunterschied besteht darin, dass RenderPartial()void zurückgegeben wird und die Ausgabe direkt in den Ausgabestream geschrieben wird, wo die Partial()Methode zurückgibt MvcHtmlString, die einer Variablen zugewiesen und bei Bedarf bearbeitet werden kann. Wenn Sie die Ausgabe einer Variablen zuweisen müssen, um sie zu bearbeiten, verwenden Sie Partial (), andernfalls RenderPartial ().

Welches ist besser für die Leistung?

Aus Sicht der Leistung ist das Rendern direkt in den Ausgabestream besser. RenderPartial()macht genau das gleiche und ist besser für die Leistung vorbei Partial().

Nazmul Hasan
quelle
5

Html.Partial: kehrt zurück MvcHtmlStringund langsam

Html.RenderPartial: direkt auf Ausgabestream rendern / schreiben und zurückgeben voidund es ist sehr schnell im Vergleich zuHtml.Partial

Navneet
quelle
3

Für "teilweise" benutze ich es immer wie folgt:

Wenn Sie etwas in eine Seite aufnehmen müssen, das Sie über den Controller aufrufen müssen (wie bei einem Ajax-Aufruf), verwenden Sie "Html.RenderPartial".

Wenn Sie ein 'statisches' Include haben, das nicht per se mit einem Controller verknüpft ist und sich beispielsweise nur im 'freigegebenen' Ordner befindet, verwenden Sie "HTML.partial".

scgough
quelle
2

@Html.PartialGibt die Ansicht in einer HTML-codierten Zeichenfolge zurück und verwendet dasselbe Ansichtsobjekt TextWriter. @Html.RenderPartialDiese Methode gibt zurück void. @Html.RenderPartialist schneller als@Html.Partial

Die Syntax für PartialView:

 [HttpGet] 
 public ActionResult AnyActionMethod
 {
     return PartialView();
 }
Mayank
quelle