Мастерские страницы и элементы управления

Из WebForms в механизм представлений в MVC пришел и подход к повторному использованию общей разметки страниц — мастерские страницы (master pages), файлы которых имеют расширение master. Мастерские страницы представляют собой инструмент для определения общего шаблона набора страниц, определяя общую разметку для набора контентных страниц и расположение блоков, содержащихся в контентных страницах.

Принцип построения мастерской страницы следующий:

1. Задается общий дизайн страницы и блоки, общие для набора страниц.

2. В разметке мастерской страницы определяются блоки, которые будут заполнены содержимым контентных страниц с помощью разметки:

<asp:ContentPlaceHolder ID="ContentPageId" runat="server" />

Пример мастерской страницы приведен в листинге 5.1.

3. При создании разметки контентных страниц используются блоки:

<asp:Content ID="myPage" ContentPlaceHolderID="ContentPageId" runat="server">

где ContentPlaceHolderID соответствует тому фрагменту мастерской страницы, который помечен элементом ContentPlaceHolder с соответствующим свойством id. Пример контентной страницы приведен в листинге 5.2.

Листинг 5.1. Пример мастерской страницы

<%@ 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>

  <div class="page">

    <div id="header">

      <div id="title">

        <h1>

          Northwind

        </h1>

      </div>

      <div id="logindisplay">

        <% Html.RenderPartial("LogOnUserControl"); %> </div>

        <div id="menucontainer">

          <ul id="menu">

            <li>

              <%= Html.ActionLink("Домашняя", "Index",

                        "Home")%>

            </li>

            <li>

              <%= Html.ActionLink("O сайте", "About",

                        "Home")%>

            </li>

          </ul>

        </div>

      </div>

      <div id="main">

        <asp:ContentPlaceHolder ID="MainContent" runat="server" /> <div id="footer">

      </div>

    </div>

  </div>

</body>

</html>

Листинг 5.2. Пример контентной страницы

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"

           Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content ID="aboutTitle" ContentPlaceHolderID="TitleContent" runat="server">

   о проекте

</asp:Content>

<asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server">

  <h2>

    О проекте

  </h2>

  <p>

    Тут что-то написано.

  </p>

</asp:Content>

Мастерские страницы могут быть вложенными, т. е. в свою очередь использовать мастерские страницы. Это может быть полезно, когда существует общая планировка всех страниц на сайте (родительская мастерская страница) и несколько вариантов планировки дизайна вложенных разделов (дочерние мастерские страницы).

На контентной странице могут быть заданы несколько блоков Content, соответствующих блокам ContentPlaceHolder, определенным на мастерской странице.

Еще одним механизмом повторного использования разметки являются пользовательские элементы управления или, в терминах MVC, частичные представления. Частичные представления — это фрагменты разметки, вынесенные в отдельный файл с расширением ascx, которые могут быть использованы на страницах представлений через вызов метода RenderPartial() класса HtmlHelper. О классе Html и его методах подробнее рассказано далее в этой главе. Ранее в листинге 5.1 приведен пример отображения частичного представления LogOnUserControl.ascx (<% Html.RenderPartial("LogCnUserControl"); %>).

Частичное представление содержит ту же самую разметку и строится по тем же принципам, что и представление. Пример разметки упомянутого ранее частичного представления LogOnUserControl.ascx показан в листинге 5.3. Разметка, приведенная в листинге 5.3, подробно рассматривается далее.

 Листинг 5.3. Разметка частичного представления LogOnUserControl.ascx

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>

<%

  if (Request.IsAuthenticated) {

%>

  Добро пожаловать <b><%= Html.Encode(Page.User.Identity.Name)

%></b>!

    [ <%= Html.ActionLink("Выход", "LogOff", "Account") %> ]

<%

  }

  else {

%>

    [ <%= Html.ActionLink("Вход", "LogOn", "Account") %> ]

<%

  }

%>

Частичные представления могут быть использованы также при создании многократно используемых функциональных блоков на разных страницах (часто называемых гаджетами), о которых речь пойдет в конце этой главы.

Более 800 000 книг и аудиокниг! 📚

Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением

ПОЛУЧИТЬ ПОДАРОК