Qual é a diferença (se houver) entre Html.Partial (visualização, modelo) e Html.RenderPartial (visualização, modelo) no MVC2?

141

Diferente do tipo que retorna e o fato de você chamá-lo de maneira diferente, é claro

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

Se eles são diferentes, por que você chamaria um e não o outro?
As definições:

// 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
fonte

Respostas:

168

A única diferença é que Partialretorna um MvcHtmlString, e deve ser chamado dentro <%= %>, enquanto RenderPartialretornavoid e renderiza diretamente para a exibição.

Se você olhar o código-fonte , verá que os dois chamam o mesmo método interno, passando um StringWriter para ele renderizar.

Você ligaria Partialse quiser visualizar, salvar ou manipular o HTML gerado em vez de gravá-lo na página.

SLaks
fonte
Ok, então não há :) como eu pensava, eu posso usá-los perfeitamente, eu acho. Obrigado :)
Stéphane
40
não, a diferença é o tipo de retorno, como disse SLaks. Isso não é trivial. Em termos de desempenho, alegou-se que a renderização diretamente no fluxo de saída é melhor (e foi por isso que eles usaram o RenderPartial vazio para começar). Parcial é principalmente útil (imo) em testes, embora, como o SLaks disse, pode haver alguns lugares em que você deseja manipular a saída antes de renderizá-la no código de produção. Eles são apenas raros, imo.
Paul
42
Parcial também é útil quando você deseja obter a saída de uma visualização no controlador. Isso pode ser usado para usar uma exibição para formatar um email.
Samg 29/09/10
3
@Paul: Quanto mais desempenho estamos falando? As reivindicações têm algum teste ou benchmark associado a elas? Seria interessante ver se há carne de verdade nisso ou se é apenas uma micro-otimização.
Chris Pratt
1
Uma pergunta que tenho é: ambos acabariam sendo renderizados no fluxo de resultados, independentemente do que você usar (já que o Razor não está chamando apenas para enviá-lo para o TextWriter da exibição renderizada), se ambos chamarem o mesmo método interno, por que um seria mais eficiente que o outro? É devido à ativação de seu próprio buffer interno (que aumentaria progressivamente conforme necessário)? Também estou feliz que alguém tenha visto uso para usar o modelo de exibição para processar emails; outro desenvolvedor pensei que estava over-fazê-lo, mas é limpo e mais fácil de manipular do que uma corda você tem que escapar tudo.
Allen Clark Copeland Jr
4

Esta é uma ótima explicação de Dino Esposito:

A diferença entre os dois métodos pode parecer pequena e inofensiva, mas pode incomodar você, se você não souber como lidar com isso. A principal diferença entre os dois métodos é:

  • Partial retorna uma string codificada em HTML
  • RenderPartialé um método nulo que grava diretamente no fluxo de saída da resposta.

O uso dos dois métodos é um pouco diferente:

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

A escolha de qual usar depende de seus requisitos. Se você precisar manipular ainda mais a cadeia que está sendo injetada no fluxo de resposta, você deve usar Partial; caso contrário, vá com RenderPartial qual é - apenas porque vai direto para o fluxo - um pouco mais rápido que Partial.

No final, os casos de uso para visualizações parciais se enquadram em um dos dois campos. A primeira é quando você cria uma vista compondo várias partes independentes de marcação, como abaixo.

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

Nesse caso, sua decisão de escolher entre RenderPartialou Partialnão altera o efeito final. No entanto, como RenderPartialé um pouco mais rápido, você pode preferir usá-lo.

Um passo adiante
fonte
4
-1 Ao copiar de outra fonte, pelo menos dê crédito. Esta é uma cópia flagrante de palavra por palavra do Pro ASP.NET MVC 3 Framework (ou pelo menos uma edição mais recente).
Robotron