Html.Partial vs Html.RenderPartial & Html.Action vs Html.RenderAction

Odpowiedzi:

1237

Html.Partialzwraca ciąg. Html.RenderPartialdzwoni Writewewnę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.Partialw zmiennej lub zwrócić je z metody, nie można tego zrobić za pomocą Html.RenderPartial.

Wynik zostanie zapisany w Responsestrumieniu podczas wykonywania / oceny.

Dotyczy to również Html.Actioni Html.RenderAction.

GvS
źródło
71
Czy wiesz, dlaczego miałbyś używać jednego nad drugim?
Jason
156
pod względem wydajności lepiej jest użyć RenderPartial, zgodnie z odpowiedzią tutaj: stackoverflow.com/questions/2729815/…
Vlad Iliescu,
13
Dzięki za zapisanie wyniku w zmiennej. To jest powód, aby użyć opcji Częściowa lub Akcja nad odpowiednikiem renderowania.
David Kassa
8
Html.Partial()został stworzony, aby mieć bardziej płynną składnię z Razor. Jak powiedział @Vlad, Html.RenderPartial()jest bardziej wydajny.
Tsahi Asher
2
@ Tsahi, który wyjaśnia, dlaczego jest używany w szablonie projektu MVC dla _LoginPartial. Dzięki.
regularmike
86

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);
}
Brett Jones
źródło
3
Mówisz, że Html.Partial ma lepszą wydajność niż Html.RenderPartial?
numer
15
Tak i nie, Html.Partial jest renderowany wbudowany i wymaga mniej zasobów, ale zajmuje więcej czasu. Html.RenderPartial jest renderowany osobno, a zatem szybciej, ale wymaga więcej zasobów. Jeśli masz duży ruch impulsowy wolą Html.Partial, aby zmniejszyć zużycie zasobów. Jeśli masz rzadkie zmiany w natężeniu ruchu, sprzyjaj Html.RenderPartial.
Brett Jones
4
Moim zdaniem jest odwrotnie: RenderPartial zdecydowanie ma lepszą wydajność, ponieważ zapisuje bezpośrednio w strumieniu wyjściowym. Częściowo wywołuje wewnętrznie tę samą metodę, ale zapisuje do StringWriter, który jest zwracany jako MvcHtmlString i ostatecznie zapisywany w strumieniu wyjściowym. Dlatego przydziela o wiele więcej pamięci.
slfan
2
@BrettJones Co rozumiesz przez „intensywnie korzystający z zasobów”? To, że Partialrenderowanie do bufora nie oznacza, że ​​jest renderowane asynchronicznie - wręcz przeciwnie - nie widzę, jak można twierdzić, że RenderPartial„wymaga więcej zasobów”.
Dai,
57

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.

David
źródło
2
Odpowiedź (dlaczego?) Jest najlepszą odpowiedzią, więc jest dla mnie najlepsza.
YEH
55

Różnica polega na tym, że pierwszy zwraca bezpośrednio odpowiedź, MvcHtmlStringale drugi ( Render..).

Aliostad
źródło
czy MvcHtmlString nie zostałby również dodany do odpowiedzi?
Shad
21

Według mnie @Html.RenderPartial()ma szybsze wykonanie niż z @Html.Partial()powodu HTML.RenderPartial daje szybką odpowiedź na Wyjście.

Ponieważ kiedy korzystam @Html.Partial(), ładowanie mojej witryny zajmuje więcej czasu niż @Html.RenderPartial()

iChirag
źródło
21

@Html.Partiali @Html.RenderPartialsą używane, gdy model widoku częściowego odpowiada modelowi nadrzędnemu, nie musimy tworzyć żadnej metody działania, aby to wywołać.

@Html.Actioni @Html.RenderActionsą 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.

Jayesh Patel
źródło
3
Dobra odpowiedź, ponieważ wyjaśniasz także, kiedy stosować opcję Częściowe nad działaniem
raklos,
15

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

Ygor Thomaz
źródło
9

Typ powrót Html.RenderActionjest voidto znaczy, że bezpośrednio powoduje, że reakcje w widoku, w którym typ powrót Html.Actionjest MvcHtmlStringmoż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.PartialiHtml.RenderPartial

Shivkumar
źródło
Jak mogę to zrobić za pomocą Html.RenderPartial?
xatz,
1
nie możemy użyć Html.RenderPartial, ponieważ jego typ zwracany jest nieważny
Namrata Jain
9

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.

Indygowiec
źródło
8

Różnice:

  1. Typem zwracanym RenderPartialjest void, gdzie jak PartialzwracaMvcHtmlString

  2. Składnia wywoływania Partial()i RenderPartial()metody w widokach Razor

    @ Html.Partial („PartialViewName”)
    @ {Html.RenderPartial („PartialViewName”); }

  3. 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().

Nazmul Hasan
źródło
5

Html.Partial: powraca MvcHtmlStringi powoli

Html.RenderPartial: bezpośrednio renderuje / zapisuje strumień wyjściowy i zwraca, voidi jest bardzo szybki w porównaniu doHtml.Partial

Navneet
źródło
3

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”

szorstki
źródło
2

@Html.Partialzwraca widok w łańcuchu HTML i używa tego samego TextWriterobiektu widoku . @Html.RenderPartialta metoda zwraca void. @Html.RenderPartialjest szybszy niż@Html.Partial

Składnia dla PartialView:

 [HttpGet] 
 public ActionResult AnyActionMethod
 {
     return PartialView();
 }
Mayank
źródło