Типовые ASP.NET2 формы
В нескольких проектах подряд мне пришлось сделать совершенно одинаковые сеточные формы, что навеяло на меня грустные мысли об отсутствии творческого характера ASP2-программирования и привело появлению этой странички.
Формы на GRIDVIEW бывают совершенно без изысков, например такие, в которых просто форма настраивается декларативно без единой строчки кода. Такие формы в дикой природе не встречаются. Зато мне в каждом проекте встречаются:
- Списковые формы, требующие выбора ключа из подчиненной таблицы для каждой записи.
- Списковые формы с возможностью добавления, удаления и редактирования карточек (отдельных записей).
Формы, в которых устанавливается ключ зависимой таблицы - выглядят примерно вот так или вот так:
Основная фишка таких форм - это контрол, который перепривязывается по-разному для каждой строки таблицы.
В данном случае, одна из колонок сетки содержит шаблон со всеми основными входными и выходными параметрами контрола и собственно сам контрол:
Соотвественно, входные параметры для работы контрола заполняются при каждом проходе по строке в строках 38, 39, 40 :
А когда происходит собственно постбек на кнопке выбора, то в строках 45-49 считываются выходные параметры контрола.
Сам по себе жизненный цикл контрола выглядит так:
Как видите, контрол читает входные параметры в SET. В строке 12 выполняет свою операцию заполнения комбешника специфическими для данной строки данными, и в строках 21 и 24 возвращает выбранные в нем данные на основную форму для выполнения собственно модификации данных.
Все остальное здесь - это конкретная специфика проекта, которая к рассматриваемой теме сеточных форм отношения не имеет. например этот контрол работает по ConnectionString, выбранной в Session - фактически тут распределенная база - юзер логинится просто в приложение, а приложение само выбирает рабочую SQL-базу для каждого юзера. Такие распределенные приложения - это отдельная идея, здесь важно то, что в таком контроле для GridView даже Page_Load не нужен.
Теперь рассмотрим второй тип сеточной формы, в которой присутствует добавление, редактирование, удаление данных и, возможно, некоторые другие специфические действия.
Сразу скажу, что пример формы для описания этой идеи выбран чисто для простоты, конечно в ASP2 нет смысла хранить прямой HTML в базе - это старинная технология выросла из PHP и простого ASP. В ASP.NET это будут динамические шаблоны, которые параметризуются. Но тем не менее, сама идея такой формы повторяется у меня из проекта в проект.
В данном случае речь идет о форме, которая хранит в себе умолчания сайта в таблице типа КЛЮЧ <-> ДАННЫЕ:
00001: CREATE TABLE [dbo].[Defaults]( 00002: [i] [int] IDENTITY(1,1) NOT NULL, 00003: [key] [nvarchar](50) NOT NULL, 00004: [template] [ntext] NOT NULL, 00005: CONSTRAINT [PK_Defaults] PRIMARY KEY CLUSTERED 00006: ( 00007: [key] ASC 00008: ) ON [PRIMARY] 00009: ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Соотвественно в CMS сайта можно эти умолчания добавлять/убирать/корректировать/просматривать в виде HTML. В режиме просмотра HTML эта формы выглядит так:
Соответсвенно, в режиме редактирования строки форма выглядит примерно так:
В режиме добавления новой строки - тоже примерно как и при редактировании. Как видите, в отличии от например такой моей формы, или вот такой редактирование происходит не по месту прямо в сетке, а в отдельном поле формы. На мой взляд это удобнее.
Обратите внимание что название кнопки New сменилось на Save - вы наверное удивитесь, половина строк этой формы обеспечивает именно эту смену названия на кнопке. Все остальное делается автоматически - чисто средой ASP2.
Теперь посмотрим подробнее на устройство этой формы:
Эта форма начинается с двух SqlDataSource - на одном из них будет собственно привязана наша основная сетка, второй SqlDataSource будет собственно писать измененные данные в базу. Заметьте, что два SqlDataSource тут обязательны. Наряду с сеткой и карточкой отдельной записи - это и есть основная характеристика таких сеточно-карточных форм.
Как видите, все довольно бесхитростно, за исключением небольшого корреклированного запроса в строке 9, который исключит запись дублирующихся данных в базу.
Далее идет собственно определение сетки:
Все опять же довольно бесхитростно, однако обратите внимание, что кроме аргумента команды я всегда ложу ключ записи в шаблон. Это у меня отработано на автоматизме. Чтобы всегда ЛЕГКО было понять с какой именно записью идет работа. Обратите внимание, что команда называется не Edit, а Edt - ведь нам же не надо стандартного обработчика редактирования по месту?
На самом деле на настройку и этих SqlDataSource и шаблона сетки я потратил ровно пять секунд - ведь все это конфигурится прямо в дизайн-тайме:
Единственное раздражающее уродство в том, что окошко с SQL-командой не растягивается по высоте и не имеет подсветки синтаксиса. Впрочем оно много чего не имеет - например не принимает ключи в виде Гуида...
Еще проще конфигурится сама сетка - сначала все подряд ее столбцы:
А затем собственно шаблон c кнопками и ключиком:
Те в этом собственно вся фишка ASP2 - первые 54 строки кода формы я создал ИСКЛЮЧЕТЕЛЬНО за несколько щелчков мышкой. Впрочем и остальной код я создал так же:
У нас как раз были два источника данных - для сетки и для карточки. Мы уже видели сетку, теперь осталось рассмотреть карточку, котораю отображает детально ЕДИНСтВЕННУЮ запись в базе.
Для отображения единственной записи можно было бы применить отдельные текстбоксы, но я пользуюсь для этого FormView - это фактически скобочки (группировочка) таких отдельных текстбоксов и меток, причем переключается весь этот пакет в одну команду FormView.DefaultMode=Insert/Edit.
Наконец, за FormView следует литерал, где будет отображаться уже внешний вид наших шаблонов в режиме Mode<>Encode, что позволит интрепретирвать значения внутри литерала как чистый HTML.
Обратите внимание, что в шаблоне FormView лежит тот же самый HiddenFields с ключиком записи. Кроме того, заметьте, что тот шаблон, который редактируется - он привязан к данным, а новый, естественно - нет. Заметьте, также, что RequestFieldValidator'ы разбиты по группам валидации.
Больше вроде бы никаких особенностей на самой форме нету - теперь посмотрим на алгоритм формы:
Как видите, если бы не флажок - Session("Edit1"), которым я переключаю текст на кнопке Save/New - то о Page_Load и GridView1_PageIndexChanged был бы просто не нужен. Тут есть небольшая специфика проекта - динамический навигатор, инициализаруемый в строке 19, и динамический выбор SQL-базы в зависимости от логина, выполняемый в строках 5-6.
Теперь рассмотрим смысловой код формы:
Строки 31-34 делают подсветку текущей строки сетки, а остальное - это просто реакция на нажатия кнопок внутри сетки, которая опять же заключается в смене названия на нижней кнопки NEW/SAVE и режима FormView в зависимости от флажка Session("Edit1"), записи данных в литерал, смены режима FormView плюс, конечно же, собственно выполнение операций с данными с помощью команды в SqlDataSource2.
Наконец, последний штрих этой формы - это запись в базу обновленных (или вовсе новых) данных их FormView:
Это опять же заполнение параметров SqlDataSource (вот тут и ключик из Hidden пригодился) и та же самая смена названия на кнопке. Как видите - тут больше половины алгоритма - это смена названия на кнопке New на Save и обратно! Все остальное тут сделано просто несколькими щелчками мышкой. Вот где сила ASP2 проявляется полностью. Попробуйте такую функциональность реализовать на PHP!
Но все же главное в этом деле, на мой взгляд - не впадать в эйфорию и четко понимать ту самую нишу, где технология такого КОСВЕННОГО создания HTML по неким казалось бы совершенно левым и бредовым абстракциям типа привязки, шаблонов и контролов дает РЕАЛЬНОЕ преимущество перед НЕПОСРЕДСТВЕННЫМ созданием HTML. Когда такая грань эффории будет пройдена и вы реально почуствуете где ИМЕННО ASP2 имеет ПРЕИМУЩЕСТВО перед ПРЯМЫМ формированием HTML - с этого момента можете считать себя ASP2-программистом.
|