В строго типизированном представлении также доступна коллекция объектов viewData
, поэтому даже при использовании строгой типизации количество элементов данных, используемых представлением, может быть модифицировано при развитии проекта.
Некоторые разработчики предпочитают для каждого из представлений создавать отдельный класс данных, с помощью которого типизировать представления. Некоторые же предпочитают использовать строгую типизацию только для того, чтобы передавать объекты в частичные представления, работая с коллекцией viewData
в разметке самих представлений. Выбор определяется предпочтениями разработчиков проекта.
Поиск элементов в коллекции ViewData
Легко представить себе ситуацию, в которой на стороне представления заранее не определено, где находятся данные — в коллекции viewData
или же в свойствах объекта viewData.Model
. Для поиска этого элемента доступен специальный метод viewData.Eval(),
осуществляющий поиск в коллекции элементов и в свойствах объекта модели, при этом поддерживается синтаксис точки (.) между именами свойств объектов.
Например, в представлении используется метод viewData.Eval("customer. lastname")
, тогда будет выполнен поиск элемента по описанному далее алгоритму.
1. Будет проверено наличие значения ViewData["customer. lastname"]
.
2. Если значение отсутствует для приведенного ранее элемента коллекции, то будет осуществлен поиск элемента ViewData["customer"]
.
3. В случае если элемент найдет по ключу "customer", то будет осуществлена попытка получить значение ViewData["customer"].lastname
, если же такого свойства у объекта, содержащегося под ключом "customer", найдено не будет, будет осуществлена попытка найти элемент вложенной коллекции ViewData["customer"]["lastname"]
.
4. В случае провала предыдущих попыток поиска будут проверены свойства объекта Model
: ViewData.Model.customer.lastname
и ViewData.Model.customer["lastname"].
Описанный ранее метод поиска приводит к нескольким выводам — при поиске элементы коллекции viewData
имеют приоритет над свойствами объекта, передаваемого через свойство в Model
, поэтому следует не допускать совпадения именований свойств объекта, передаваемого через Model и элементов коллекции ViewData
.
Использование метода viewData.Eval
несет в себе также и возможность передавать строку для форматирования вывода данных.
Метод viewData
используется внутренней инфраструктурой MVC Framework для связывания данных с полями ввода и вывода информации о проверке корректности данных, о чем подробнее будет рассказано далее в этой главе вразд. "Валидация данных форм”.
Генерация разметки представлением
Для создания логики генерации представления в MVC Framework используются несколько подходов.
□ Вложенный управляющий код. Логика отображения данных описывается непосредственно внутри файла разметки ASPX с использованием стандартного синтаксиса для управляющих конструкций и синтаксиса для вывода строковых значений непосредственно в результирующий код разметки.
□ Вспомогательные методы для генерации разметки. Вспомогательные методы позволяют многократно использовать фрагменты логики генерации представления и представляют собой вызовы некоторых методов, возвращающих строки. В библиотеке MVC Framework существует большой набор готовых вспомогательных методов, представленных как методы-расширения для классов Html, Url, Ajax, однако в качестве вспомогательного метода может быть использован любой метод, возвращающий строковое значение.
□ Серверные элементы управления. Несмотря на отсутствие возможности использования событийной модели, серверные элементы управления ASP.NET по-прежнему могут быть использованы для декларативного отображения данных.
Примечание
На самом деле в приведенном ранее списке присутствует немного лукавства, поскольку, по большому счету, генерация представлений в конечном итоге основывается на создании компилируемого управляющего кода.
Рассмотрим каждый из подходов подробно на практическом примере, и по мере изложения материала будем создавать работающее демонстрационное приложение, использующее разобранные ранее возможности.
*****************************************
Вложенный управляющий код
Рассмотрим простейший пример — в представлении необходимо вывести таблицу, содержащую набор записей, переданных контроллером через коллекцию viewData
. В качестве источника данных используется ставшая уже стандартом де-факто для примеров база данных Northwind, для доступа к которой используется LINQ для SQL, подробно описанный в главе 3.
Читать дальше
Конец ознакомительного отрывка
Купить книгу