ASP.NET MVC 4 в действии
Джеффри Палермо
Компонент MvcContrib Grid
MvcContrib Grid – это UI-компонент, который создает хорошо сформированную HTML таблицу. Он использует свободный интерфейс, который позволяет вам определять конфигурацию Grid с помощью строго типизированного и поддерживающего рефакторинг синтаксиса. Поддержка рефакторинга заставляет этот стиль компонента отлично работать с помощью таких инструментов рефакторинга, как JetBrains ReSharper и DevExpress Refactor! Pro. Для этого вида компонентов, в основном, требуется строго типизированное представление, которое используется для запуска API Grid.
Когда вы будете устанавливать комплект MvcContrib с помощью NuGet, вы увидите нечто подобное:
Листинг 14-3: Установка MvcContrib с помощью NuGet
PM> install-package MvcContrib.Mvc3-ci
Attempting to resolve dependency 'Mvc3Futures'.
Successfully installed 'Mvc3Futures 3.0.20105.0'.
Successfully installed 'MvcContrib.Mvc3-ci 3.0.86.0'.
Successfully added 'Mvc3Futures 3.0.20105.0' to MvcContribGridUsingNuget.
Successfully added 'MvcContrib.Mvc3-ci 3.0.86.0' to MvcContribGridUsingNuget.
Использование MvcContrib Grid
Одним из сценариев, где вы, возможно, захотите использовать Grid таким образом, будет отображение списка объектов модели. Следующий листинг демонстрирует действие, которое отправляет модель IEnumerable
в представление для отображения.
Листинг 14-4: Действие, которое отображает список объектов Person
public ActionResult AutoColumns() {
return View(_peopleFactory.CreatePeople());
}
Этот пример игнорирует большинство таких продвинутых возможностей, как подкачка страниц. В нем просто отправляется каждый объект Person
приложения в представление для отображения.
Следующий шаг – использование MvcContrib Grid для получения представления ваших объектов Person
в табличном формате:
@Html.Grid(Model).AutoGenerateColumns()
Метод AutoGenerateColumns
будет автоматически генерировать столбцы в таблице на основании открытых свойств объекта Person
, как это показано на рисунке 14-10.
Рисунок 14-10: Представление, созданное AutoGenerateColumns
.
Это полезно всего лишь в некоторых ситуациях. На рисунке 14-10 вы увидите, что существуют некоторые столбцы такие, как Roles
, значения которых Grid не знает, как отображать. Используемое по умолчанию поведение – это вызов ToString
для каждого значения свойства, но это не особенно полезно для сложных типов, поскольку он всего лишь отображает наименование типа. AutoGenerateColumns
наиболее полезен в том случае, если вы используете заранее определенную модель представления, а не вложенную иерархию объектов.
Перспективное использование MvcContrib Grid
Несмотря на то, что предыдущий пример MvcContrib Grid, казалось, волшебным образом работал с помощью всего лишь единственной строки кода представления, Grid обладает некоторыми достаточно устойчивыми мнениями о том, как он будет отображать модель. Например, он допускает, что все открытые свойства должны отображаться в виде столбцов (если только они не отмечены атрибутом ScaffoldColumn
). Если вас не устраивает такое поведение, вы можете использовать больше возможностей – и именно здесь в игру вступает Grid.
Следующий листинг демонстрирует то, каким образом вы можете использовать Grid для того, чтобы настроить выходные данные индивидуальных столбцов.
Листинг 14-5: Использование MvcContrib Grid с еще большим контролем
@Html.Grid(Model).Columns(column =>
{
column.For(x => x.Id).Named("Person ID");
column.For(x => x.Name);
column.For(x => x.Gender);
column.For(x => x.DateOfBirth).Format("{0:d}");
column.For(x => Html.ActionLink("View Person", "Show", new { id = x.Id })).Encode(false);
})
В этом листинге столбцы точно определяются посредством вызова метода Columns
, который использует вложенное замыкание (nested closure) для того, чтобы указать, какие свойства упомянутой модели должны отображаться в виде столбцов таблицы. Это делается путем передачи лямбда-выражения в метод column.For
. По умолчанию название свойства будет использоваться в качестве заголовка столбца, но данный факт можно переопределить посредством связывания в цепочку вызова метода Named
и предоставления пользовательского названия столбца.
Столбцы могут быть намного сложнее, нежели просто содержать простое свойство. Например, последний столбец в листинге 14-5 определяет столбец, который содержит гиперссылку.
MvcContrib Grid, созданный с помощью кода представления в листинге 14-5, будет отлично отображаться в таблице, как это продемонстрировано на рисунке 14-11.
Рисунок 14-11: MvcContrib Grid, отображаемый с помощью конфигурации столбцов.
Главной причиной явного задания столбцов для Grid является тот факт, что вы можете настраивать выходные данные различных столбцов (например, путем использования формата пользовательской строки или путем добавления в таблицу дополнительных столбцов).
Синтаксис определения Grid может сначала показаться странным – он использует некоторые новейшие возможности языка C#. Например, лямбда-выражения используются для указания того, какие свойства должны отображаться в виде столбцов таблицы. При использовании этого синтаксиса если вы измените название свойства с помощью инструмента рефакторинга, то свойство также изменится и в коде вашего представления. Эта возможность исключает ошибки, появляющиеся во время выполнения, которые вы наблюдали, когда использовали "магические строки" и прежнюю модель связывания данных для того, чтобы настраивать то, как вытаскивать значения свойств из вашей модели и отображать их в таблице. Несмотря на то, что MvcContrib Grid был одним из первых компонентов, который использовал этот метод конфигурации, этот стиль стал модным.
Grid был создан и в настоящее время поддерживается в работоспособном состоянии Джереми Скиннером, куратором MvcContrib проекта. Для получения более подробной информации о Grid перейдите к MvcContrib проекту на сайте http://www.mvccontrib.org. Вы можете найти больше информации и публикаций блогов создателя Grid на сайте http://www.jeremyskinner.co.uk. В Grid встроено большое количество дополнительных возможностей, которые мы не можем охватить в данной главе, но MvcContrib проект имеет множество примеров, в которых рассматриваются расширенные возможности использования Grid.