Jaka jest różnica (jeśli istnieje) między Html.Partial (widok, model) i Html.RenderPartial (widok, model) w MVC2?

141

Poza typem, który zwraca i faktem, że oczywiście nazywasz go inaczej

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

Jeśli są różne, dlaczego miałbyś dzwonić do jednego zamiast do drugiego?
Definicje:

// 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
źródło

Odpowiedzi:

168

Jedyną różnicą jest to, że Partialzwraca MvcHtmlStringi musi zostać wywołane wewnątrz <%= %>, podczas gdy RenderPartialzwraca voidi renderuje bezpośrednio do widoku.

Jeśli spojrzysz na kod źródłowy , zobaczysz, że oba wywołują tę samą metodę wewnętrzną, przekazując StringWriter do renderowania.

Powinieneś zadzwonić, Partialjeśli chcesz wyświetlić, zapisać lub manipulować wygenerowanym kodem HTML zamiast zapisywać go na stronie.

SLaks
źródło
Ok, więc nie ma :) tak jak myślałem, mogę z nich korzystać bezproblemowo. Dzięki :)
Stéphane
40
nie, różnica polega na typie powrotu, jak powiedział SLaks. To jest nietrywialne. Jeśli chodzi o wydajność, twierdzono, że renderowanie bezpośrednio do strumienia wyjściowego jest lepsze (dlatego na początku zastosowano void RenderPartial). Częściowe jest głównie przydatne (imo) w testowaniu, chociaż, jak powiedział SLaks, mogą być miejsca, w których chcesz manipulować wyjściem przed renderowaniem go w kodzie produkcyjnym. Są po prostu rzadkie, imo.
Paul
42
Częściowe jest również pomocne, gdy chcesz uzyskać dane wyjściowe widoku w kontrolerze. Może to służyć do formatowania wiadomości e-mail za pomocą widoku.
Samg
3
@Paul: O ile bardziej wydajne mówimy? Czy z oświadczeniami są powiązane jakieś testy lub testy porównawcze? Byłoby interesujące zobaczyć, czy jest w tym prawdziwe mięso, czy to tylko mikro-optymalizacja.
Chris Pratt,
1
Mam pytanie: oba kończą się renderowaniem do strumienia wyników, niezależnie od tego, którego używasz (ponieważ w Razor nie wywołuje go tylko wysyłając go do TextWriter renderowanego widoku), jeśli obaj wywołują tę samą metodę wewnętrzną, dlaczego czy jeden byłby bardziej wydajny niż drugi? Czy to dlatego, że uruchamia swój własny wewnętrzny bufor (który będzie się stopniowo rozszerzał w razie potrzeby)? Cieszę się również, że ktoś inny używał modelu widoku do renderowania wiadomości e-mail; inny programista pomyślał, że przesadzam, ale jest czystszy i łatwiejszy w manipulowaniu niż struna, w której musisz uciec.
Allen Clark Copeland Jr
4

To świetne wyjaśnienie Dino Esposito:

Różnica między tymi dwiema metodami może wydawać się niewielka i nieszkodliwa, ale może cię ugryźć, jeśli nie wiesz, jak sobie z tym poradzić. Kluczowa różnica między tymi dwiema metodami to:

  • Partial zwraca ciąg zakodowany w formacie HTML
  • RenderPartialjest metodą void, która zapisuje bezpośrednio do strumienia wyjściowego odpowiedzi.

Użycie tych dwóch metod jest nieco inne:

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

Wybór, którego użyć, zależy od Twoich wymagań. Jeśli potrzebujesz dalej manipulować łańcuchem wprowadzanym do strumienia odpowiedzi, powinieneś użyć Partial; w przeciwnym razie idź z RenderPartial który jest - tylko dlatego, że idzie prosto do strumienia - trochę szybciej niż Partial.

W końcu przypadki użycia częściowych widoków należą do jednego z dwóch obozów. Pierwszym jest tworzenie widoku przez zestawianie razem różnych niezależnych elementów znaczników, jak poniżej.

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

W takim przypadku Twoja decyzja co do wyboru między RenderPartiallub Partialnie zmienia efektu końcowego. Jednak ponieważ RenderPartialjest nieco szybszy, możesz go preferować.

StepUp
źródło
4
-1 Kopiując z innego źródła, przynajmniej podaj uznanie. To jest rażąca kopia słowo w słowo z Pro ASP.NET MVC 3 Framework (lub przynajmniej nowszej edycji).
Robotron