Html.Partial против Html.RenderPartial & Html.Action против Html.RenderAction - PullRequest
991 голосов
/ 09 марта 2011

В ASP.NET MVC, в чем разница между:

  • Html.Partial и Html.RenderPartial
  • Html.Action и Html.RenderAction

Ответы [ 13 ]

1198 голосов
/ 09 марта 2011

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.

83 голосов
/ 18 апреля 2012

Думайте о @ 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);
}
55 голосов
/ 09 марта 2011

Разница в том, что первый возвращает MvcHtmlString, но второй (Render..) вывод прямо к ответу.

52 голосов
/ 18 ноября 2015

Вот что я нашел:

Используйте RenderAction , когда у вас нет модели для отправки в представление, и у вас есть много html-файлов для возврата, которые не нужныбыть сохраненным в переменной.

Использовать Действие , если у вас нет модели для отправки в представление и имеется небольшой текст для возврата, который необходимо сохранить впеременная.

Используйте RenderPartial , когда у вас есть модель для отправки в представление, и будет много HTML, который не нужно хранить в переменной.

Используйте Частичное , когда у вас есть модель для отправки в представление, и будет небольшой объем текста, который необходимо сохранить в переменной.

RenderAction и RenderPartial быстрее.

21 голосов
/ 04 февраля 2012

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

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

18 голосов
/ 23 марта 2015

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

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

14 голосов
/ 03 октября 2012

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

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

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

8 голосов
/ 13 мая 2016

Различия:

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

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

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

8 голосов
/ 07 февраля 2016

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

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

8 голосов
/ 12 сентября 2012

Тип возврата 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

...