Чтение онлайн

на главную - закладки

Жанры

Шрифт:

Листинг 5.10. Вспомогательный метод для отображения элемента для ввода даты

using System.Web.Mvc;

public static class DataPickerHelper {

public static string DatePicker(this HtmlHelper html,

string id, string text)

{

}

}

Такой метод может быть использован в коде представления через синтаксис

<%= Html.DatePicker("id", "name") %>.

Непосредственная

реализация этого метода может быть разной. Давайте посмотрим на то, как можно подойти к созданию такого простого элемента, как набор выпадающих списков для выбора даты.

Конкатенация строк

Самый очевидный способ — сгенерировать разметку конкатенацией строк. Код для этого метода приведен в листинге 5.11.

Листинг 5.11. Реализация метода DatePickerc помощью конкатенации строк

using System.Web.Mvc;

using System.Text;

using System;

using System.Globalization;

public static class DataPickerHelper

{

public static string DatePicker(this HtmlHelper html, string id)

{

return DatePicker(html, id, String.Empty);

}

public static string DatePicker(this HtmlHelper html,

string id, string text)

{

StringBuilder sb = new StringBuilder;

if (!String.IsNullOrEmpty(text))

{

sb.Append("<div id=\"");

sb.Append (id);

sb.Append("\">");

sb.Append(text);

}

/* Day */

sb.Append("<select id=\"day_");

sb.Append(id);

sb.Append("\">");

sb.Append("<option></option>") ;

for (int i = 1; i <= 31; i++)

{

sb.Append("<option>");

sb.Append(i.ToString);

sb.Append("</option>");

sb.Append("</select>");

sb.Append(" ");

}

/* Month */

sb.Append("<select id=\"month_");

sb.Append(id);

sb.Append("\">");

sb.Append("<option></option>");

for (int i = 0; i <= 11; i++)

{

sb.Append("<option>");

sb.Append(DateTimeFormatInfo.CurrentInfo.MonthNames[i]);

sb.Append("</option>");

}

sb.Append("</select>");

sb.Append(" ");

/* Year */

sb.Append("<select id=\"year_");

sb.Append(id);

sb.Append("\">");

sb.Append("<option></option>");

for (int i = 1900; i <= DateTime.Now.Year; i++)

{

sb.Append("<option>");

sb.Append(i.ToString);

sb.Append("</option>");

}

sb.Append("</select>");

if (!String.IsNullOrEmpty(text))

{

sb.Append("</div>");

}

return sb.ToString;

}

}

Плюс

решения, продемонстрированного в листинге 5.11, — простота реализации "в лоб", копированием кода из макета верстки. Минусы решения очевидны — поддержка такого кода сложна за счет необходимости работы с кодом, перемешанным с большим количеством строковых констант.

Использование ресурсов

Упростить модификацию самой разметки и внесение в нее косметических изменений можно за счет размещения статических строковых констант в файлах ресурсов. Генерацию финальной разметки при этом можно выполнять, используя только методы форматирования строк, как это показано в листинге 5.12.

Листинг 5.12. Реализация метода DatePickerc помощью ресурсов

public static string DatePicker(this HtmlHelper html,

string id, string text)

{

return String.Format(Resources.DatePicker, id, text,

Resources.DaysOptions,

Resources.MonthsOptions, Resources.YearsOptions);

}

В приведенном фрагменте есть заметное преимущество — централизованное управление разметкой, возможность использования разной разметки для различных культур и разделение самой разметки и кода. Можно пойти дальше и создать дополнительную обертку над ресурсами, которая будет отвечать за небольшую модификацию фрагментов разметки. Кода в случае, приведенном в листинге 5.12, значительно меньше, чем в листинге 5.11, однако гибкость такого решения может быть недостаточной для вспомогательных методов, требующих частой модификации.

Использование дополнительных слоев абстракции

Достигнуть большего контроля над логикой и разметкой можно за счет использования дополнительной абстракции над созданием самой разметки, вынесением отдельных методов, генерирующих повторяющие элементы, и созданием тегов с помощью специального класса TagBuilder. В WebForms при создании контролов (Custom Controls) используется похожий подход.

TagBuilder активно применяется в расширениях, входящих в саму сборку System.Web.Mvc, в чем можно убедиться, посмотрев, например, на исходный код System.Web.MVC.SelectExtensions.

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

Листинг 5.13. Реализация метода DatePicker с дополнительными слоями абстракции

public static class DataPickerHelper

{

private static string DAY_PREFIX = "day_";

Поделиться:
Популярные книги

Русская мафия 1988-2007

Карышев Валерий Михайлович
Документальная литература:
публицистика
6.25
рейтинг книги
Русская мафия 1988-2007

На кресах всходних

Попов Михаил Михайлович
Проза:
современная проза
роман
5.00
рейтинг книги
На кресах всходних

Индийская философия (Том 1)

Радхакришнан Сарвепалли
Научно-образовательная:
философия
5.00
рейтинг книги
Индийская философия (Том 1)

Большая охота на акул

Томпсон Хантер С.
Альтернатива
Проза:
контркультура
5.00
рейтинг книги
Большая охота на акул

Система Возвышения. (цикл 1-8) - Николай Раздоров

Раздоров Николай
Система Возвышения
Фантастика:
боевая фантастика
4.65
рейтинг книги
Система Возвышения. (цикл 1-8) - Николай Раздоров

Туман. Авель Санчес; Тиран Бандерас; Салакаин отважный. Вечера в Буэн-Ретиро

де Унамуно Мигель
141. Библиотека всемирной литературы
Проза:
классическая проза
5.00
рейтинг книги
Туман. Авель Санчес; Тиран Бандерас; Салакаин отважный. Вечера в Буэн-Ретиро

Весь Гамильтон Эдмонд в одном томе

Гамильтон Эдмонд Мур
Абсолют
Фантастика:
боевая фантастика
ужасы и мистика
космическая фантастика
5.00
рейтинг книги
Весь Гамильтон Эдмонд в одном томе

Благие намерения

Лукина Любовь Александровна
Фантастика:
фэнтези
научная фантастика
7.50
рейтинг книги
Благие намерения

Армагеддон. Омнибус

Грин Джонатан
Армагеддон
Фантастика:
эпическая фантастика
5.00
рейтинг книги
Армагеддон. Омнибус

#9 Печать пожирателя

Соломенный Илья
9. Пожиратель
Фантастика:
аниме
сказочная фантастика
попаданцы
6.00
рейтинг книги
#9 Печать пожирателя

По ходу пьесы. История одного пистолета. Это его дело. Внезапная смерть игрока. Идея в семь миллионов

Эдигей Ежи
Детективы:
полицейские детективы
5.00
рейтинг книги
По ходу пьесы. История одного пистолета. Это его дело. Внезапная смерть игрока. Идея в семь миллионов

Франкенштейн: Антология

Шелли Мэри
1. Лучшее
Фантастика:
социально-философская фантастика
научная фантастика
ужасы и мистика
7.43
рейтинг книги
Франкенштейн: Антология

Цикл "Идеальный мир для Лекаря". Компиляция. Книги 1-30

Сапфир Олег
Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Цикл Идеальный мир для Лекаря. Компиляция. Книги 1-30

Аврора Горелика (сборник)

Аксенов Василий Павлович
Поэзия:
драматургия
6.25
рейтинг книги
Аврора Горелика (сборник)