Яка різниця (якщо така є) між 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, а не писати його на сторінку.


Гаразд, так що немає жодного :), як я думав, я можу їх легко використовувати, я думаю. Дякую :)
Stéphane

40
ні, різниця - це тип повернення, як сказав SLaks. Це нетривіально. З точки зору продуктивності, стверджувалося, що візуалізація безпосередньо у вихідний потік є кращою (саме тому вони почали починати з недійсного RenderPartial). Часткове використання в основному корисне (imo) для тестування, хоча, як сказав SLaks, можливо, є кілька місць, якими ви хочете маніпулювати результатом, перш ніж відобразити його у виробничому коді. Вони просто рідкісні, імо.
Пол

42
Часткове також корисно, коли ви хочете отримати вигляд подання в контролері. Це можна використовувати для перегляду для форматування електронної пошти.
Самг

3
@Paul: Скільки ще виконавців ми говоримо? Чи мають претензії якісь тестування або орієнтири, пов’язані з ними? Було б цікаво подивитися, чи є в цьому дійсне м’ясо чи це лише мікрооптимізація.
Кріс Пратт

1
У мене виникає питання: обидва в кінцевому підсумку будуть передані в потік результатів незалежно від того, який ви використовуєте (оскільки в Razor це не просто викликає його, надсилаючи його до TextWriter виведеного виду), якщо вони обидва викликають один і той же внутрішній метод, чому хтось би був більш ефективним, ніж інший? Це пов'язано з тим, що він закручує власний внутрішній буфер (який поступово розширюватиметься в міру необхідності)? Також я радий, що хтось інший бачив, як використовувати модель перегляду для надсилання електронної пошти; інший розробник подумав, що я це надмірно роблю, але це чистіше і простіше в маніпулюванні, ніж струна, з якої ти повинен уникнути всього.
Аллен Кларк Коупленд, молодший,

4

Це чудове пояснення Діно Еспозіто:

Різниця між двома методами може виглядати невеликою і нешкідливою, але вона може вкусити вас, якщо ви не знаєте, як з цим впоратися. Ключова відмінність двох методів:

  • Partial повертає HTML-кодований рядок
  • RenderPartialє недійсним метод , який записує безпосередньо в вихідний потік відповіді.

Використання двох методів дещо відрізняється:

@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це трохи швидше, ви можете скористатися ним.


4
-1 Коли ви копіюєте з іншого джерела, принаймні надайте кредит. Це кричуща копія «слово за словом» з Pro ASP.NET MVC 3 Framework (або принаймні нової версії).
Роботрон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.