(ASP.NET) ASP.NET (2007 год)

Типовые 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-программистом.



Комментарии к этой страничке ( )
ссылка на эту страничку: http://www.vb-net.ru/asp2/30/index.htm
<Назад>  <Назад>  <Назад>  <Назад>  <Назад>  <Назад>  <На главную>  <В раздел ASP>  <В раздел NET>  <В раздел SQL>  <В раздел Разное>  <Написать автору>  < Поблагодарить>