В ASP.NET MVC какая разница между:
Html.Partialа такжеHtml.RenderPartialHtml.Actionа такжеHtml.RenderAction
В ASP.NET MVC какая разница между:
Html.Partial а также Html.RenderPartialHtml.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: требуется дочерний метод действия. используйте, когда данные для отображения в представлении имеют независимую модель.
Отличия:
Возвращаемый тип RenderPartialis 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();
}