Razor: @ Html.Partial () vs @RenderPage ()

94

Jaki jest właściwy sposób renderowania szablonu podrzędnego?

Jaka jest różnica? Oba wydają się działać dla mnie.

A dlaczego @Html.RenderPartial()już nie działa?

Evgenyt
źródło

Odpowiedzi:

128
Html.Partial("MyView")

Renderuje widok „MyView” do pliku MvcHtmlString. Jest zgodny ze standardowymi regułami wyszukiwania widoku (tj. Sprawdź bieżący katalog, a następnie sprawdź Sharedkatalog).

Html.RenderPartial("MyView")

Działa tak samo, jak Html.Partial(), z tą różnicą, że zapisuje swoje dane wyjściowe bezpośrednio w strumieniu odpowiedzi. Jest to bardziej wydajne, ponieważ zawartość widoku nie jest buforowana w pamięci. Jednak ponieważ metoda nie zwraca żadnych danych wyjściowych, @Html.RenderPartial("MyView")nie będzie działać. Trzeba owinąć połączenie w bloku kodu zamiast: @{Html.RenderPartial("MyView");}.

RenderPage("MyView.cshtml")

Renderuje określony widok (identyfikowany przez ścieżkę i nazwę pliku, a nie przez nazwę widoku) bezpośrednio do strumienia odpowiedzi, na przykład Html.RenderPartial(). Możesz dostarczyć dowolny model do widoku, dołączając go jako drugi parametr

RenderPage("MyView.cshtml", MyModel)
Annabelle
źródło
8
Czy są jakieś wskaźniki wzrostu wydajności @ {Html.RenderPartial ("MyView");} w porównaniu z @ Html.RenderPartial ("MyView")?
Faust
@Faust czy chodziło Ci o Partial vd RenderPartial?
Cacho Santa
1
@cacho: tak, mój komentarz powinien brzmieć @Html.Partial("MyView")vs.@{Html.RenderPartial("MyView");}
Faust
2
Mała poprawka: drugi parametr w RenderPage () nie jest modelem, jest to obiekt param [], do którego można uzyskać dostęp za pośrednictwem właściwości PageData. Wygląda na to, że działa jak powyżej, ponieważ domyślnie model ze strony „nadrzędnej” jest przekazywany do strony „podrzędnej”. msdn.microsoft.com/en-us/library/…
Jon
Czy istnieje sposób na zagnieżdżenie całej strony wzdłuż modelu przez wywołanie RenderPage? Chcę zagnieździć inną stronę, określając określony parametr zapytania, który z kolei będzie filtrował dane na tej stronie, a ponadto usuwał własny układ.
Shimmy Weitzhandler
17

wolę

@RenderPage("_LayoutHeader.cshtml")

Nad

@{ Html.RenderPartial("_LayoutHeader"); }

Tylko dlatego, że składnia jest łatwiejsza i bardziej czytelna. Poza tym wydaje się, że nie ma żadnych różnic pod względem funkcjonalności.

EDYCJA: Jedną z zalet RenderPartial jest to, że nie musisz określać całej ścieżki ani rozszerzenia pliku, co spowoduje automatyczne przeszukanie wspólnych miejsc.

Ryan Sampson
źródło
1
Myślę, że to powinien być komentarz, a nie odpowiedź. Zgadzam się też ze RenderPagewzględu na składnię.
Iman Mahmoudinasab
6

Metoda RenderPartial nie zwraca znaczników HTML, jak większość innych metod pomocniczych. Zamiast tego zapisuje zawartość bezpośrednio w strumieniu odpowiedzi, dlatego musimy nazywać ją pełną linią języka C #, używając średnika.

Jest to nieco bardziej wydajne niż buforowanie renderowanego kodu HTML z częściowego widoku, ponieważ i tak zostanie on zapisany w strumieniu odpowiedzi. Jeśli wolisz bardziej spójną składnię, możesz użyć metody Html.Partial , która działa dokładnie tak samo jak metoda RenderPartial , ale zwraca fragment HTML i może być używana jako @ Html.Partial ("Produkt", p).

Omid Shariati
źródło
2

Możemy również przekazać model za pomocą widoków częściowych. @ Html.Partial ("MyView", "MyModel");

bayram
źródło
0
@RenderPages() 

Powyższe nie działa w ASP.NET MVC. Działa tylko na stronach internetowych.

@Html.Partial("_Footer")

Będziesz musiał użyć powyższego w ASP.NET MVC.

Umar Aftab
źródło