Шрифт:
Частичное представление содержит ту же самую разметку и строится по тем же принципам, что и представление. Пример разметки упомянутого ранее частичного представления 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") %> ]
<%
}
%>
Частичные представления могут быть использованы также при создании многократно используемых функциональных блоков на разных страницах (часто называемых гаджетами), о которых речь пойдет в конце этой главы.
Файлы представлений в структуре проекта
В главе 1 уже рассматривалось размещение файлов в директории проекта, однако сейчас остановимся на этой теме подробнее.
Все файлы, относящиеся к представлениям, размещаются внутри директории Views, во вложенных директориях, соответствующих названиям контроллеров, использующих эти представления, либо внутри директории Shared, содержащей представления, мастерские страницы и частичные представления, используемые разными контроллерами.
Допустим, что в проекте присутствуют два контроллера: HomeController и AccountController, тогда структура директории Views выглядит следующим образом:
? Account — в этой директории содержатся представления, используемые действиями контроллера Account.
? Home — в этой директории содержатся представления, используемые действиями контроллера Home.
? Shared — в этой директории содержатся мастерские страницы, частичные представления и представления, которые могут быть использованы всеми контроллерами, например, страница с информацией об ошибке, возникшей во время выполнения действия контроллера.
? Из действия контроллера можно обратиться к представлению, находящемуся в любой из директорий, указав полный путь к представлению. Аналогично, представление может использовать частичные представления, размещенные в разных директориях, с указанием полного пути к ним, однако такой подход приводит к путанице, и мы настоятельно рекомендуем группировать представления, относящиеся к одному контроллеру, в одну директорию.
? В случае, когда нескольким контроллерам может понадобиться использовать одну и ту же разметку представления, стоит подумать о будущем развитии проекта и выбрать один из двух путей.
? Разметка всегда будет одинакова для обоих контроллеров — в этом случае представление следует разместить в директории Shared.
? Разметка может в будущем различаться — в этом случае общую разметку следует вынести в файл частичного представления и поместить в директорию Shared, а для каждого из контроллеров создать собственное представление. Не стоит смущаться, если в начале разработки проекта каждое из представлений будет содержать только ссылку на общее частичное представление — в будущем будет значительно проще модифицировать представления для контроллеров, если избежать слияния разметки в самом начале развития проекта.
? Директория Views предназначена только для файлов представлений, обрабатываемых механизмом генерации представлений, статические файлы, используемые на страницах (js, .css, изображения), следует размещать в других директориях. Например, в шаблонном проекте MVC Application, создаваемом Visual Studio, предлагается использовать для статических файлов директорию Content, а для скриптов .js директорию Scripts. Здесь уже выбор может определяться полностью вашим вкусом. Неплохой идеей может быть создание директории Content с вложенной структурой директорий, повторяющей структуру директории Views, где статические файлы будут размещены по тому же принципу, что и в директории Views. Возможно, что вам будет удобнее создать иную структуру директорий и группировать статические файлы не по принадлежности к представлениям, а по расположению звезд на небосклоне или какой-либо другой логике.
Данные для отображения и ViewData
В главе 1 кратко был описан механизм передачи данных от контроллера представлению. Поскольку основной задачей представления является отображение данных, мы подробно остановимся на этой теме.
ViewData — это класс типа viewDataDictionary, из названия типа которого очевидно, что ViewData представляет собой коллекцию типа ключ-значения, называемую словарем.
public class ViewDataDictionary : IDictionary<string, object> {}