Главная страница   /   14.3. Компонент MvcContrib Grid (ASP.NET MVC 4 в действии

ASP.NET MVC 4 в действии

ASP.NET MVC 4 в действии

Джеффри Палермо

14.3. Компонент 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.