В ASP.NET MVC, в чем разница между:
-
Html.Partial
иHtml.RenderPartial
-
Html.Action
иHtml.RenderAction
В ASP.NET MVC, в чем разница между:
Html.Partial
и Html.RenderPartial
Html.Action
и Html.RenderAction
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
.
Подумайте о @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);
}
Разность сначала возвращает MvcHtmlString
, а второй (Render..
) вывод прямо к ответу.
Вот что я нашел:
Используйте RenderAction, когда у вас нет модели для отправки в представление и есть много html для возврата, которое не нужно хранить в переменной.
Используйте Действие, если у вас нет модели для отправки в представление и немного текста для возврата, который нужно сохранить в переменной.
Используйте RenderPartial, когда у вас есть модель для отправки в представление, и будет много html, которое не нужно хранить в переменной.
Используйте Частично, когда у вас есть модель для отправки в представление, и будет немного текста, который нужно сохранить в переменной.
RenderAction и RenderPartial быстрее.
В соответствии со мной @Html.RenderPartial()
имеет более быстрое выполнение, чем @Html.Partial()
из-за Html.RenderPartial дает быстрый ответ на Output.
Потому что, когда я использую @Html.Partial()
, мой сайт занимает больше времени для загрузки по сравнению с @Html.RenderPartial()
@Html.Partial
и @Html.RenderPartial
используются, когда ваша модель частичного представления соответствует родительской модели, нам не нужно создавать какой-либо метод действий для вызова этого.
@Html.Action
и @Html.RenderAction
используются, когда ваша модель частичного просмотра независима от родительской модели, в основном она используется, когда вы хотите отображать содержимое любого типа виджетов на странице. Вы должны создать метод действия, который возвращает результат частичного просмотра при вызове метода из представления.
Подробнее о вопросе:
"Когда Html.RenderPartial() вызывается только с именем частичного view, ASP.NET MVC передаст частичное представление той же модели и Объекты словаря ViewData, используемые шаблоном вызывающего вида.
"NerdDinner" из Professional ASP.NET MVC 1.0
Возвращаемый тип 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
Частичный или RenderPartial: Не нужно создавать метод действия. использовать, когда данные, которые будут отображаться на частичном представлении, уже присутствуют в модели текущей страницы.
Действие или RenderAction: Требуется метод дочернего действия. использовать, когда данные для отображения на представлении имеют независимую модель.
Отличия:
Возвращаемый тип 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()
.
Html.Partial
: возвращает MvcHtmlString
и медленно
Html.RenderPartial
: прямой рендеринг/запись в выходном потоке и возвращает void
, и он очень быстрый по сравнению с Html.Partial
Для "частичного" я всегда использую его следующим образом:
Если вам нужно включить в страницу, которую вам нужно пройти через контроллер (например, с вызовом Ajax), используйте "Html.RenderPartial".
Если у вас есть "статический" include, который не связан с контроллером per se и как раз в "общей" папке, например, используйте "HTML.partial"
@Html.Partial
возвращает представление в строке в кодировке HTML и использует тот же объект TextWriter
. @Html.RenderPartial
этот метод возвращает void
. @Html.RenderPartial
быстрее, чем @Html.Partial
Синтаксис для PartialView
:
[HttpGet]
public ActionResult AnyActionMethod
{
return PartialView();
}
Различия Html.Partial и Html.RenderPartial, Html.Action и Html.RenderAction
это может помочь