Html.Partial vs Html.RenderPartial & Html.Action vs Html.RenderAction

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

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

Ответы

Ответ 1

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.

Ответ 2

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

'@Html.Partial' возвращает строку, закодированную в HTML, которая построена встроенной с родителем. Он обращается к родительской модели.

'@Html.RenderPartial' возвращает эквивалент пользовательского элемента .ascx. Он получает свою собственную копию страницы ViewDataDictionary, а изменения, внесенные в RenderPartial ViewData, не влияют на родительские 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

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

Ответ 4

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

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

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

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

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

RenderAction и RenderPartial быстрее.

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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

"NerdDinner" из Professional ASP.NET MVC 1.0

Ответ 8

Возвращаемый тип 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

Ответ 9

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

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

Ответ 10

Отличия:

  • Возвращаемый тип RenderPartial равен void, где as Partial возвращает MvcHtmlString

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

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

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

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

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

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

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

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

Ответ 11

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

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

Ответ 12

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

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

Если у вас есть "статический" include, который не связан с контроллером per se и как раз в "общей" папке, например, используйте "HTML.partial"

Ответ 13

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

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

 [HttpGet] 
 public ActionResult AnyActionMethod
 {
     return PartialView();
 }