В 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()
был создан, чтобы иметь более свободный синтаксис с Razor. Как сказал @Vlad, Html.RenderPartial()
это более эффективно.
Представьте, что @ 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);
}
Partial
рендеринг в буфер не означает, что он рендерится асинхронно - совсем наоборот - я не могу понять, как можно утверждать, что RenderPartial
он «более ресурсоемкий».
Вот что я нашел:
Используйте RenderAction, когда у вас нет модели для отправки в представление, и у вас есть много html-файлов для возврата, которые не нужно хранить в переменной.
Используйте действие, если у вас нет модели для отправки в представление, и у вас есть небольшой текст для возврата, который необходимо сохранить в переменной.
Используйте RenderPartial, когда у вас есть модель для отправки в представление, и будет много HTML, который не нужно хранить в переменной.
Используйте Partial, если у вас есть модель для отправки в представление, и там будет немного текста, который нужно сохранить в переменной.
RenderAction и RenderPartial работают быстрее.
@Html.Partial
и @Html.RenderPartial
используются, когда ваша модель частичного представления соответствует родительской модели, нам не нужно создавать какой-либо метод действия для вызова этого.
@Html.Action
и @Html.RenderAction
используются, когда ваша модель частичного представления не зависит от родительской модели, в основном она используется, когда вы хотите отобразить любое содержимое типа виджета на странице. Вы должны создать метод действия, который возвращает частичный результат просмотра при вызове метода из представления.
Подробнее о вопросе:
«Когда Html.RenderPartial () вызывается только с именем частичного представления, ASP.NET MVC передает частичному представлению те же объекты словаря Model и ViewData, которые используются в вызывающем шаблоне представления».
«NerdDinner» из Профессиональной ASP.NET MVC 1.0
Возвращаемый тип 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
Partial или RenderPartial: нет необходимости создавать метод действия. используйте, когда данные для отображения в частичном представлении уже присутствуют в модели текущей страницы.
Action или RenderAction: требуется дочерний метод действия. используйте, когда данные для отображения в представлении имеют независимую модель.
Отличия:
Возвращаемый тип RenderPartial
is 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()
.
Для «частичного» я всегда использую его следующим образом:
Если есть что-то, что вам нужно включить в страницу, которую вам нужно пройти через контроллер (как если бы вы использовали вызов Ajax), тогда используйте «Html.RenderPartial».
Если у вас есть «статическое» включение, которое не связано с контроллером как таковое, а просто находится в папке «shared», например, используйте «HTML.partial»
@Html.Partial
возвращает представление в HTML-кодированной строке и использовать тот же TextWriter
объект представления.
@Html.RenderPartial
этот метод возврата void
.
@Html.RenderPartial
быстрее чем@Html.Partial
Синтаксис для PartialView
:
[HttpGet]
public ActionResult AnyActionMethod
{
return PartialView();
}