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.


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..) выводит прямо в ответ.


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» из Профессиональной 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


Как я могу сделать это с 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


3

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

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

Если у вас есть «статическое» включение, которое не связано с контроллером как таковое, а просто находится в папке «shared», например, используйте «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.