Html.Partial против 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.

GvS
источник
71
Знаете ли вы, почему вы будете использовать один над другим?
Джейсон
156
С точки зрения производительности, лучше использовать RenderPartial, а ответил здесь: stackoverflow.com/questions/2729815/...
Влад Илиеску
13
Спасибо за бит о сохранении результата в переменную. Это причина для использования Partial или Action над аналогом 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..) выводит прямо в ответ.

Aliostad
источник
MvcHtmlString также не будет добавлен к ответу?
Шэд
21

По моему мнению, @Html.RenderPartial()имеет более быстрое выполнение, чем @Html.Partial()из-за Html.RenderPartial дает быстрый ответ на вывод.

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

iChirag
источник
21

@Html.Partialи @Html.RenderPartialиспользуются, когда ваша модель частичного представления соответствует родительской модели, нам не нужно создавать какой-либо метод действия для вызова этого.

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

Джаеш Патель
источник
3
Хороший ответ, потому что вы также объясняете, когда использовать Partial over Action
raklos
15

Подробнее о вопросе:

«Когда Html.RenderPartial () вызывается только с именем частичного представления, ASP.NET MVC передает частичному представлению те же объекты словаря Model и ViewData, которые используются в вызывающем шаблоне представления».

«NerdDinner» из Профессиональной ASP.NET MVC 1.0

Игорь Томаз
источник
9

Возвращаемый тип Html.RenderActionявляется voidэто означает , что непосредственно оказывает ответы в View , где тип возврата 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

Shivkumar
источник
Как я могу сделать это с Html.RenderPartial?
xatz
1
мы не можем использовать Html.RenderPartial, потому что его тип возврата недействителен
Namrata Jain
9

Partial или RenderPartial: нет необходимости создавать метод действия. используйте, когда данные для отображения в частичном представлении уже присутствуют в модели текущей страницы.

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

индиго
источник
8

Отличия:

  1. Возвращаемый тип RenderPartialis void, где as PartialвозвращаетMvcHtmlString

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

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

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

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

Ниже приведены два распространенных вопроса об интервью, Partial()и RenderPartial() когда вы будете использовать их Partial()снова RenderPartial()и наоборот?

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

Какой из них лучше для производительности?

С точки зрения производительности лучше рендеринг непосредственно в выходной поток. RenderPartial()делает то же самое и лучше для производительности Partial().

Назмул Хасан
источник
5

Html.Partial: возвращается MvcHtmlStringи медленно

Html.RenderPartial: напрямую выводить / записывать в выходной поток и возвращать, voidи это очень быстро по сравнению сHtml.Partial

Navneet
источник
3

Для «частичного» я ​​всегда использую его следующим образом:

Если есть что-то, что вам нужно включить в страницу, которую вам нужно пройти через контроллер (как если бы вы использовали вызов Ajax), тогда используйте «Html.RenderPartial».

Если у вас есть «статическое» включение, которое не связано с контроллером как таковое, а просто находится в папке «shared», например, используйте «HTML.partial»

scgough
источник
2

@Html.Partialвозвращает представление в HTML-кодированной строке и использовать тот же TextWriterобъект представления. @Html.RenderPartialэтот метод возврата void. @Html.RenderPartialбыстрее чем@Html.Partial

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

 [HttpGet] 
 public ActionResult AnyActionMethod
 {
     return PartialView();
 }
Mayank
источник