У 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” від 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, де як PartialповертаєтьсяMvcHtmlString
Синтаксис виклику Partial()та RenderPartial()методи в представленнях Razor
@ Html.Partial ("PartialViewName")
@ {Html.RenderPartial ("PartialViewName"); }
Синтаксис виклику Partial()та RenderPartial()способів у представленнях веб-форм
[%: Html.Partial ("PartialViewName")%]
[% Html.RenderPartial ("PartialViewName"); %]
Нижче наведені 2 поширених питання щодо інтерв'ю, пов'язані з Partial()та RenderPartial()
коли ви використовуєте Partial()їх RenderPartial()і навпаки?
Основна відмінність полягає в тому, що RenderPartial()return void і вихід буде записаний безпосередньо у вихідний потік, де як Partial()метод повертається MvcHtmlString, який може бути призначений змінній та маніпулювати нею, якщо потрібно. Отже, коли виникає необхідність призначити вихідну змінну для маніпулювання нею, тоді використовуйте Partial (), інакше використовуйте RenderPartial ().
Який з них краще для продуктивності?
З точки зору продуктивності, рендерінг безпосередньо у вихідний потік кращий. RenderPartial()робить точно те ж саме і краще для виконання Partial().
Для "часткового" я завжди використовую це так:
Якщо є щось, що вам потрібно включити на сторінку, яку вам потрібно перейти через контролер (як, наприклад, виклик Ajax), тоді використовуйте "Html.RenderPartial".
Якщо у вас є "статичний", який не пов'язаний з контролером, а просто у папці "спільний доступ", наприклад, використовуйте "HTML.partial"
@Html.Partialповертає перегляд у кодованій HTML рядку та використовує той самий TextWriterоб’єкт перегляду .
@Html.RenderPartialцей метод повернення void.
@Html.RenderPartialшвидше, ніж@Html.Partial
Синтаксис для PartialView:
[HttpGet]
public ActionResult AnyActionMethod
{
return PartialView();
}