Widoki częściowe pozwalają na wyodrębnienie ze strony pewnych części do osobnego pliku. Załóżmy, że projektujemy widok strony głównej sklepu internetowego. Z pewnością taki widok zawiera m.in. informacje o stanie koszyka, menu, listę kategorii i produkty w promocji. Można oczywiście wszystkie dane umieścić w jednym pliku aspx. Niestety w takim przypadku plik źródłowy widoku byłby bardzo długi i skomplikowany. Lepszym rozwiązaniem jest zapisanie poszczególnych fragmentów do różnych plików – widoków częściowych.
Widoki częściowe zapisane są w pliku o rozszerzeniu ascx. Sposób definiowania widoku częściowego praktycznie niczym nie różni się od standardowej strony ASP .NET MVC. Jedyną różnicą jest wykorzystanie deklaracji Control zamiast Page:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> Ostatnio dodane produkty. To jest widok częściowy.
Widok można podpiąć za pomocą RenderParial:
<%Html.RenderPartial("NazwaWidokuCzesciowego");%>
Warto zauważyć, że widok częściowy może również zostać podpięty do innego widoku częściowego. Tworząc formularz wyświetlający profil użytkownika wszelkie dane kontaktowe i adresowe warto umieszczać w osobnych plikach (np. Contact.ascx, Address.ascx). Oprócz czytelności zyskujemy możliwość wykorzystania tych samych widoków na różnych stronach.
Z kolei MasterPages definiują powtarzalny fragment widoku. Bardzo możliwe, że w naszej aplikacji na każdej podstronie, niezależnie od prezentowanej treści, wyświetla się menu i logo. Nie warto w takim przypadku w każdym widoku pisać kod html odpowiedzialny za wyświetlenie loga czy menu. Lepiej zdefiniować szablon w pojedynczym pliku. Do tego właśnie służą MasterPage. Przykładowy szablon:
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title> <link href="../../Content/Site.css" rel="stylesheet" type="text/css" /> </head> <body> <img src='/logo.jpg' alt='logo'/> Jakaś treść wspólna dla wszystkich podstron. <asp:ContentPlaceHolder ID="MainContent" runat="server" /> </body> </html>
MasterPage w odróżnieniu od zwykłych stron zawiera deklarację Master. W celu określenia miejsc w których będzie pojawiała się treść zależna od konkretnej strony używamy ContentPlaceHolder. W powyższym przykładzie zdefiniowano dwa PlaceHoldery – jeden odpowiedzialny za wstrzyknięcie tytułu strony a drugi za wyświetlanie konkretnej treści. Strona wykorzystująca zdefiniowany szablon powinna wyglądać następująco:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> <asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server"> Tytul konkretnej podstrony </asp:Content> <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> Treść konkretnej podstrony </asp:Content>
Koncepcja MasterPage nie jest nowa i dla programistów ASP .NET WebForms z pewnością jest już znana.
Jest jeden problem ,gdyż placeholder nadpisuje cały title. Jak rozwiązać, aby można na sztywno dopisać coś do title np. – http://www.mojastrona.pl.
Z góry dziękuję za pomoc 🙂
Pozdrawiam
trochę się pospieszyłem z pytaniem 😉
rozwiązanie jest bardzo proste:
trzeba dodać w
Pozdrawiam