Html.Partial vs Html.RenderPartial & Html.Action проти Html.RenderAction


Відповіді:


1237

Html.Partialповертає рядок Html.RenderPartialдзвонить Writeвнутрішньо і повертається void.

Основне використання:

// Razor syntax
@Html.Partial("ViewName")
@{ Html.RenderPartial("ViewName");  }

// WebView syntax
<%: Html.Partial("ViewName") %>
<% Html.RenderPartial("ViewName"); %>

У фрагменті вище обидва дзвінки дадуть однаковий результат.

Хоча можна зберігати вихідну інформацію Html.Partialу змінній або повернути її з методу, не можна цього зробити Html.RenderPartial.

Результат буде записаний у Responseпотік під час виконання / оцінки.

Це стосується Html.Actionі та Html.RenderAction.


71
Чи знаєте ви, чому б ви використовували один над іншим?
Джейсон

156
ефективніше краще використовувати RenderPartial, на що тут відповіли: stackoverflow.com/questions/2729815/…
Влад Ілієску,

13
Дякуємо за трохи про збереження результату у змінній. Це причина використовувати Часткове або Дія над аналогом Render.
Девід Касса

8
Html.Partial()був створений, щоб мати більш вільний синтаксис з Razor. Як сказав @Vlad, Html.RenderPartial()він більш ефективний.
Цахі Ашер

2
@Tsahi пояснює, чому він використовується в шаблоні проекту MVC для _LoginPartial. Дякую.
регулярний майк

86

Подумайте про @ Html.Partial як HTML-код, скопійований на батьківську сторінку. Подумайте про @ Html.RenderPartial як контроль користувача .ascx, включений на батьківську сторінку. Керування користувачами .ascx має набагато більше витрат.

'@ Html.Partial' повертає HTML-кодований рядок, який будується вбудованим разом із батьківським. Це доступ до батьківської моделі.

'@ Html.RenderPartial' повертає еквівалент управління .ascx користувача. Він отримує власну копію ViewDataDictionary сторінки та зміни, внесені у ViewData RenderPartial, не впливають на ViewData батьків.

Використовуючи рефлексію, ми знаходимо:

public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, object model, ViewDataDictionary viewData)
{
    MvcHtmlString mvcHtmlString;
    using (StringWriter stringWriter = new StringWriter(CultureInfo.CurrentCulture))
    {
        htmlHelper.RenderPartialInternal(partialViewName, viewData, model, stringWriter, ViewEngines.Engines);
        mvcHtmlString = MvcHtmlString.Create(stringWriter.ToString());
    }
    return mvcHtmlString;
}

public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName)
{
    htmlHelper.RenderPartialInternal(partialViewName, htmlHelper.ViewData, null, htmlHelper.ViewContext.Writer, ViewEngines.Engines);
}

3
Ви хочете сказати, що Html.Partial має кращу ефективність, ніж Html.RenderPartial?
numaroth

15
Так і ні, Html.Partial надається вбудованим та менш ресурсоємним, але забирає більше часу. Html.RenderPartial надається окремо і, отже, швидше, але більш ресурсомістке. Якщо у вас великий об'єм трафіку, вигідте Html.Partial для зменшення використання ресурсів. Якщо у вас є нечасті зміни обсягу трафіку, користь Html.RenderPartial.
Бретт Джонс

4
На мою думку, це навпаки: RenderPartial, безумовно, має кращу ефективність, оскільки пише безпосередньо у вихідний потік. Частково внутрішньо викликає той самий метод, але записує у StringWriter, який повертається як MvcHtmlString і, нарешті, записується у вихідний потік. Тому він виділяє набагато більше пам’яті.
slfan

2
@BrettJones Що ви маєте на увазі під "ресурсоємним"? Тільки тому Partial, що рендеринг в буфер не означає, що він відображається асинхронно - зовсім навпаки - я не бачу, як можна стверджувати RenderPartial, що "більш ресурсомісткий".
Дай

57

Ось що я знайшов:

Використовуйте RenderAction, коли у вас немає моделі для надсилання до перегляду та у вас є багато html, щоб повернути, що не потрібно зберігати у змінній.

Використовуйте Дію, коли у вас немає моделі для надсилання до перегляду та маєте трохи тексту, щоб повернути, який потрібно зберігати у змінній.

Використовуйте RenderPartial, коли у вас є модель для надсилання до перегляду, і там буде багато html, який не потрібно зберігати у змінній.

Використовуйте Partial, коли у вас є модель для надсилання до перегляду, і там буде трохи тексту, який потрібно зберігати в змінній.

RenderAction і RenderPartial проходять швидше.


2
Відповідь (чому?) - найкраща відповідь, тому це найкраще для мене.
YEH

55

Різниця спочатку повертає, MvcHtmlStringале другий ( Render..) виводить прямо у відповідь.


Чи не буде доданий MvcHtmlString до відповіді?
Шад

21

На мою думку @Html.RenderPartial(), швидше виконання, ніж @Html.Partial()завдяки Html.RenderPartial, дає швидку відповідь на вихід.

Тому що коли я використовую @Html.Partial(), мій веб-сайт потребує більше часу для завантаження порівняно з @Html.RenderPartial()


21

@Html.Partialі @Html.RenderPartialвикористовуються, коли модель часткового перегляду відповідає кореспонденції батьківської моделі, нам не потрібно створювати жодних методів дій, щоб викликати це.

@Html.Actionі @Html.RenderActionвикористовуються, коли модель часткового перегляду не залежить від батьківської моделі, в основному вона використовується, коли ви хочете відобразити будь-який вміст віджетів на сторінці. Ви повинні створити метод дії, який повертає результат часткового перегляду під час виклику методу з подання.


3
Хороша відповідь, тому що ви також пояснюєте, коли використовувати Partial over Action
raklos

15

Детальніше про запитання:

"Коли Html.RenderPartial () викликається лише іменем часткового перегляду, ASP.NET MVC передасть частковому виду ті самі об'єкти словника Model і ViewData, які використовуються шаблоном виду виклику."

“NerdDinner” від Professional ASP.NET MVC 1.0


9

Тип повернення Html.RenderAction- voidце означає, що він безпосередньо надає відповіді в Перегляді, де тип повернення Html.Action- MvcHtmlStringВи можете переглядати його візуалізацію в контролері та змінювати його, використовуючи наступний метод

protected string RenderPartialViewToString(string viewName, object model)
    {
        if (string.IsNullOrEmpty(viewName))
            viewName = ControllerContext.RouteData.GetRequiredString("action");

        ViewData.Model = model;

        using (StringWriter sw = new StringWriter())
        {
            ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
            ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
            viewResult.View.Render(viewContext, sw);
            return sw.GetStringBuilder().ToString();
        }
    }

Це поверне рядок Html Перегляду.

Це також стосується Html.PartialтаHtml.RenderPartial


Як я можу це зробити за допомогою Html.RenderPartial?
xatz

1
ми не можемо використовувати Html.RenderPartial, оскільки його тип повернення недійсний
Namrata Jain

9

Часткове або RenderPartial: Не потрібно створювати метод дій. використовувати, коли дані, що відображаються на частковому поданні, вже є у моделі поточної сторінки.

Дія або RenderAction: потрібен метод дочірньої дії. використовувати, коли дані для відображення на перегляді мають незалежну модель.


8

Відмінності:

  1. Тип повернення RenderPartialє void, де як PartialповертаєтьсяMvcHtmlString

  2. Синтаксис виклику Partial()та RenderPartial()методи в представленнях Razor

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

  3. Синтаксис виклику Partial()та RenderPartial()способів у представленнях веб-форм

[%: Html.Partial ("PartialViewName")%]
[% Html.RenderPartial ("PartialViewName"); %]

Нижче наведені 2 поширених питання щодо інтерв'ю, пов'язані з Partial()та RenderPartial() коли ви використовуєте Partial()їх RenderPartial()і навпаки?

Основна відмінність полягає в тому, що RenderPartial()return void і вихід буде записаний безпосередньо у вихідний потік, де як Partial()метод повертається MvcHtmlString, який може бути призначений змінній та маніпулювати нею, якщо потрібно. Отже, коли виникає необхідність призначити вихідну змінну для маніпулювання нею, тоді використовуйте Partial (), інакше використовуйте RenderPartial ().

Який з них краще для продуктивності?

З точки зору продуктивності, рендерінг безпосередньо у вихідний потік кращий. RenderPartial()робить точно те ж саме і краще для виконання Partial().


5

Html.Partial: повертається MvcHtmlStringі повільно

Html.RenderPartial: безпосередньо візуалізація / запис у вихідному потоці та поверненні, voidі це дуже швидко порівняно зHtml.Partial


3

Для "часткового" я завжди використовую це так:

Якщо є щось, що вам потрібно включити на сторінку, яку вам потрібно перейти через контролер (як, наприклад, виклик Ajax), тоді використовуйте "Html.RenderPartial".

Якщо у вас є "статичний", який не пов'язаний з контролером, а просто у папці "спільний доступ", наприклад, використовуйте "HTML.partial"


2

@Html.Partialповертає перегляд у кодованій HTML рядку та використовує той самий TextWriterоб’єкт перегляду . @Html.RenderPartialцей метод повернення void. @Html.RenderPartialшвидше, ніж@Html.Partial

Синтаксис для PartialView:

 [HttpGet] 
 public ActionResult AnyActionMethod
 {
     return PartialView();
 }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.