ASP .NET MVC – widoki częściowe, MasterPages

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.

2 thoughts on “ASP .NET MVC – widoki częściowe, MasterPages”

Leave a Reply

Your email address will not be published.