Quelle est la différence (le cas échéant) entre Html.Partial (vue, modèle) et Html.RenderPartial (vue, modèle) dans MVC2?

141

Autre que le type qu'il renvoie et le fait que vous l'appelez différemment bien sûr

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

S'ils sont différents, pourquoi appelleriez-vous l'un plutôt que l'autre?
Les définitions:

// 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
la source

Réponses:

168

La seule différence est que Partialrenvoie un MvcHtmlString, et doit être appelé à l'intérieur <%= %>, alors que RenderPartialrenvoie voidet rend directement à la vue.

Si vous regardez le code source , vous verrez qu'ils appellent tous les deux la même méthode interne, en passant un StringWriter pour le rendre.

Vous appelleriez Partialsi vous souhaitez afficher, enregistrer ou manipuler le code HTML généré au lieu de l'écrire sur la page.

SLaks
la source
Ok, donc il n'y en a pas :) comme je le pensais, je peux les utiliser de manière transparente, je suppose. Merci :)
Stéphane
40
non, la différence est le type de retour, comme l'a dit SLaks. Ce n'est pas anodin. En termes de performances, il a été affirmé que le rendu directement dans le flux de sortie est meilleur (c'est pourquoi ils sont allés avec le vide RenderPartial pour commencer). Partiel est surtout utile (imo) dans les tests, bien que, comme SLaks l'a dit, il peut y avoir des endroits où vous souhaitez manipuler la sortie avant de la rendre dans le code de production. Ils sont juste rares, imo.
Paul
42
Partiel est également utile lorsque vous souhaitez obtenir la sortie d'une vue dans le contrôleur. Cela peut être utilisé pour utiliser une vue pour formater un e-mail.
Samg le
3
@Paul: De combien plus performant parlons-nous? Les réclamations sont-elles associées à des tests ou des points de référence? Il serait intéressant de voir s'il y a de la viande à cela ou s'il ne s'agit que d'une micro-optimisation.
Chris Pratt
1
Une question que je me pose est la suivante: les deux finiraient par être rendus dans le flux de résultats quel que soit celui que vous utilisez (car dans Razor, il ne s'agit pas simplement de l'appeler en l'envoyant au TextWriter de la vue rendue), s'ils appellent tous les deux la même méthode interne, pourquoi l'un serait-il plus performant que l'autre? Est-ce dû au fait qu'il crée son propre tampon interne (qui s'élargirait progressivement au besoin)? Je suis également heureux que quelqu'un d'autre ait vu l'utilisation du modèle de vue pour rendre les e-mails; un autre développeur pensait que j'en faisais trop, mais c'est plus propre et plus facile à manipuler qu'une chaîne dans laquelle vous devez tout échapper.
Allen Clark Copeland Jr
4

Voici une excellente explication de Dino Esposito:

La différence entre les deux méthodes peut sembler petite et inoffensive, mais elle peut vous mordre si vous ne savez pas comment la gérer. La principale différence entre les deux méthodes est:

  • Partial renvoie une chaîne encodée en HTML
  • RenderPartialest une méthode void qui écrit directement dans le flux de sortie de la réponse.

L'utilisation des deux méthodes est légèrement différente:

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

Le choix de celui à utiliser dépend de vos besoins. Si vous avez besoin de manipuler davantage la chaîne injectée dans le flux de réponse, vous devez utiliser Partial; sinon allez avec RenderPartial qui est-juste parce qu'il va directement au flux-un peu plus vite que Partial.

En fin de compte, les cas d'utilisation des vues partielles se situent dans l'un ou l'autre des deux camps. Le premier est lorsque vous créez une vue en composant ensemble divers éléments de balisage indépendants, comme ci-dessous.

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

Dans ce cas, votre décision de choisir entre RenderPartialou Partialne change pas l'effet final. Cependant, comme il RenderPartialest légèrement plus rapide, vous préférerez peut-être l'utiliser.

StepUp
la source
4
-1 Lors de la copie depuis une autre source, au moins donner du crédit. Ceci est une copie flagrante mot à mot de Pro ASP.NET MVC 3 Framework (ou du moins une édition plus récente).
Robotron