W ASP.NET MVC jaka jest różnica między:
Html.Partial
iHtml.RenderPartial
Html.Action
iHtml.RenderAction
W ASP.NET MVC jaka jest różnica między:
Html.Partial
i Html.RenderPartial
Html.Action
i Html.RenderAction
Odpowiedzi:
Html.Partial
zwraca ciąg. Html.RenderPartial
dzwoni Write
wewnętrznie i zwraca void
.
Podstawowym zastosowaniem jest:
// Razor syntax
@Html.Partial("ViewName")
@{ Html.RenderPartial("ViewName"); }
// WebView syntax
<%: Html.Partial("ViewName") %>
<% Html.RenderPartial("ViewName"); %>
W powyższym fragmencie oba wywołania przyniosą ten sam wynik.
Chociaż można przechowywać dane wyjściowe Html.Partial
w zmiennej lub zwrócić je z metody, nie można tego zrobić za pomocą Html.RenderPartial
.
Wynik zostanie zapisany w Response
strumieniu podczas wykonywania / oceny.
Dotyczy to również Html.Action
i Html.RenderAction
.
Html.Partial()
został stworzony, aby mieć bardziej płynną składnię z Razor. Jak powiedział @Vlad, Html.RenderPartial()
jest bardziej wydajny.
Pomyśl o @ Html.Partial jak o kodzie HTML skopiowanym na stronę nadrzędną. Pomyśl o @ Html.RenderPartial jako o kontroli użytkownika .ascx wbudowanej w stronę nadrzędną. Kontrola użytkownika .ascx ma znacznie większy narzut.
„@ Html.Partial” zwraca ciąg znaków zakodowany w formacie HTML, który jest konstruowany w jednej linii z elementem nadrzędnym. Uzyskuje dostęp do modelu rodzica.
„@ Html.RenderPartial” zwraca równowartość kontroli użytkownika .ascx. Pobiera własną kopię ViewDataDictionary strony, a zmiany wprowadzone w ViewData obiektu RenderPartial nie wpływają na ViewData rodzica.
Za pomocą refleksji znajdujemy:
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
renderowanie do bufora nie oznacza, że jest renderowane asynchronicznie - wręcz przeciwnie - nie widzę, jak można twierdzić, że RenderPartial
„wymaga więcej zasobów”.
Oto, co znalazłem:
Użyj RenderAction, jeśli nie masz modelu do wysłania do widoku i masz dużo kodu HTML do przywrócenia, który nie musi być przechowywany w zmiennej.
Użyj akcji, gdy nie masz modelu do wysłania do widoku i masz trochę tekstu do przywrócenia, który musi być przechowywany w zmiennej.
Użyj RenderPartial, jeśli masz model do wysłania do widoku, a będzie dużo html, który nie musi być przechowywany w zmiennej.
Użyj Częściowe, gdy masz model do wysłania do widoku, a będzie trochę tekstu, który musi być przechowywany w zmiennej.
RenderAction i renderPartial są szybsze.
@Html.Partial
i @Html.RenderPartial
są używane, gdy model widoku częściowego odpowiada modelowi nadrzędnemu, nie musimy tworzyć żadnej metody działania, aby to wywołać.
@Html.Action
i @Html.RenderAction
są używane, gdy model częściowego widoku jest niezależny od modelu nadrzędnego. Zasadniczo jest on używany, gdy chcesz wyświetlić zawartość dowolnego typu widżetu na stronie. Musisz utworzyć metodę akcji, która zwróci wynik częściowego widoku podczas wywoływania metody z widoku.
Więcej na temat pytania:
„Gdy Html.RenderPartial () jest wywoływany tylko z nazwą widoku częściowego, ASP.NET MVC przekaże do widoku częściowego te same obiekty słownika Model i ViewData używane przez szablon widoku wywołującego.”
„NerdDinner” z Professional ASP.NET MVC 1.0
Typ powrót Html.RenderAction
jest void
to znaczy, że bezpośrednio powoduje, że reakcje w widoku, w którym typ powrót Html.Action
jest MvcHtmlString
można pochwycić renderowania widok kontrolera i modyfikować za pomocą następującej metody
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();
}
}
To zwróci ciąg HTML widoku.
Dotyczy to również Html.Partial
iHtml.RenderPartial
Częściowy lub renderujący: Nie ma potrzeby tworzenia metody akcji. użyj, gdy dane do wyświetlenia w widoku częściowym są już obecne w modelu bieżącej strony.
Akcja lub czynność renderowania: Wymaga metody akcji podrzędnej. używaj, gdy dane do wyświetlenia w widoku mają niezależny model.
Różnice:
Typem zwracanym RenderPartial
jest void
, gdzie jak Partial
zwracaMvcHtmlString
Składnia wywoływania Partial()
i RenderPartial()
metody w widokach Razor
@ Html.Partial („PartialViewName”)
@ {Html.RenderPartial („PartialViewName”); }
Składnia wywoływania Partial()
i RenderPartial()
metody w widokach formularzy internetowych
[%: Html.Partial („PartialViewName”)%]
[% Html.RenderPartial („PartialViewName”); %]
Poniżej znajdują się 2 wspólne kwestie związane z wywiadu Partial()
i RenderPartial()
kiedy należy użyć Partial()
ponad RenderPartial()
i vice versa?
Główną różnicą jest to, że RenderPartial()
zwraca void, a dane wyjściowe zostaną zapisane bezpośrednio w strumieniu wyjściowym, gdzie jako Partial()
metoda powraca MvcHtmlString
, którą można przypisać do zmiennej i w razie potrzeby manipulować nią. Tak więc, gdy istnieje potrzeba przypisania wyniku do zmiennej w celu manipulowania nią, użyj Partial (), w przeciwnym razie użyj RenderPartial ().
Który z nich jest lepszy pod względem wydajności?
Z punktu widzenia wydajności lepsze jest renderowanie bezpośrednio do strumienia wyjściowego. RenderPartial()
robi dokładnie to samo i jest lepszy pod względem wydajności Partial()
.
W przypadku „częściowego” zawsze używam go w następujący sposób:
Jeśli jest coś, co musisz zawrzeć na stronie, którą musisz przejść przez kontroler (tak jak w przypadku wywołania Ajax), użyj „Html.RenderPartial”.
Jeśli masz dołączenie „statyczne”, które nie jest powiązane z kontrolerem jako takim i tylko na przykład w folderze „udostępnionym”, użyj „HTML.partial”