В чем разница (если есть) между Html.Partial (представление, модель) и Html.RenderPartial (представление, модель) в MVC2?

141

Помимо типа, который он возвращает, и того факта, что вы называете его по-другому, конечно

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

Если они разные, почему бы вам позвонить одному, а не другому?
Определения:

// 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);
    }
}
Стефан
источник

Ответы:

168

Единственное отличие состоит в том, что Partialвозвращает MvcHtmlStringи должен вызываться внутри <%= %>, тогда как RenderPartialвозвращает voidи отображает непосредственно в представление.

Если вы посмотрите на исходный код , вы увидите, что они оба вызывают один и тот же внутренний метод, передавая StringWriter для его рендеринга.

Вы должны позвонить, Partialесли хотите просмотреть, сохранить или изменить сгенерированный HTML-код вместо записи его на страницу.

SLaks
источник
Хорошо, так что их нет :) как я думал, я могу использовать их без проблем. Спасибо :)
Стефан
40
нет, разница в типе возврата, как сказал SLaks. Это нетривиально. С точки зрения производительности было заявлено, что рендеринг непосредственно в выходной поток лучше (вот почему они пошли с void RenderPartial для начала). Частичное в основном полезно (imo) при тестировании, хотя, как сказал SLaks, могут быть некоторые места, в которых вы хотите манипулировать выводом перед его рендерингом в производственном коде. Они просто редкие, имо.
Пол
42
Частичное также полезно, когда вы хотите получить вывод представления в контроллере. Это можно использовать для использования представления для форматирования электронного письма.
Samg
3
@ Пол: Насколько эффективнее мы говорим? Связаны ли с претензиями какие-либо тесты или тесты? Было бы интересно посмотреть, есть ли в этом настоящее мясо или это просто микрооптимизация.
Крис Пратт
1
У меня есть вопрос: оба в конечном итоге будут отображаться в потоке результатов независимо от того, какой вы используете (поскольку в Razor он не просто вызывает его отправку в TextWriter визуализированного представления), если они оба вызывают один и тот же внутренний метод, почему один будет более производительным, чем другой? Это связано с тем, что он наращивает собственный внутренний буфер (который будет постепенно расширяться по мере необходимости)? Также я рад, что кто-то еще нашел применение модели представления для отображения электронных писем; другой разработчик подумал, что я переусердствовал, но это чище и проще в обращении, чем веревка, в которой нужно убегать от всего.
Аллен Кларк Коупленд-младший,
4

Это отличное объяснение Дино Эспозито:

Разница между этими двумя методами может показаться небольшой и безвредной, но она может укусить вас, если вы не знаете, как с ней обращаться. Ключевое различие между этими двумя методами:

  • Partial возвращает строку в кодировке HTML
  • RenderPartial- это метод void, который записывает непосредственно в выходной поток ответа.

Использование этих двух методов немного отличается:

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

Выбор того, что использовать, зависит от ваших требований. Если вам нужно дополнительно манипулировать строкой, вводимой в поток ответа, вы должны использовать Partial; в противном случае выберите то, RenderPartial что есть - просто потому, что он идет прямо в поток - немного быстрее, чем Partial.

В конце концов, варианты использования частичных представлений можно разделить на два лагеря. Первый - это когда вы создаете представление, составляя вместе различные независимые части разметки, как показано ниже.

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

В этом случае ваше решение о выборе между RenderPartialили Partialне меняет конечный эффект. Однако, поскольку RenderPartialон немного быстрее, вы можете предпочесть его.

StepUp
источник
4
-1 При копировании из другого источника хоть отдать должное. Это явная дословная копия из Pro ASP.NET MVC 3 Framework (или, по крайней мере, более новой версии).
Роботрон