Разработка электроники,
Систем автоматики,
Программного обеспечения
ООО "Антех ПСБ", Санкт-Петербург
+79811865082
anteh@bk.ru
Телеграм: собака antehru
Создаем свой серверный web элемент управления, наследуемый например от GridView или другого штатного контрола public class EGridView : GridView, IScriptControl. И для расширения функциональности нужно использовать дополнительные файлы .gif, .jpg, .png, .ico, .css, .js, .html и т.д. Т.е. эти файлы будут встроенны в .dll контрола.
Добавление графического изображения во встроенные ресурсы сборки
Рассмотрим добавление и использование изображения, например .jpg формата как фонового изображение текущего контрола 4шага.
1. Размещаем файл изображения в проекте серверного элемента управления(контрола). Файл помещаем в корень проекта, либо в какую -либо папку проекта.
2. В свойствах файла изображения нужно задать "Действие при построении" как встроенный ресурс(Embedded Resource).
3. Нижеприведённую строку-атрибут […] добавляем в .cs файл проекта серверного элемента управления перед namespace…. Или в файл AssemblyInfo.cs разрабатываемого серверного элемента управления.
|
Здесь ServControlEGridView.eresource.pictures.background.jpg -путь к web ресурсу. ServControlEGridView -пространство имён контрола, eresource -папка находящаяся в корне проекта контрола, pictures -папка вложенная в eresource, background.jpg -собственно файл изображения. Вместо '/', при указании пути, используется точка. "image/jpg" -тип ресурса. Ниже скриншот того, как это выглядит в студии:
И наконец PerformSubstitution -если вкратце, то =true, если описываемый ресурс имеет ссылки на другие ресурсы. Например для файлов изображений не нужен, по умолчанию =false. Для .css .html .js указывется =true, если в файлах .css .html .js имеются ссылки на какие либо ресурсы. Если ссылок нет, то при PerformSubstitution =true хуже не было.
Если посмотреть на вопрос шире, то: в MSDN(перевод), написано: "если true, то внедренные ресурсы разрешаются во время обработки ресурсов; в противном случае - значение false. Значение по умолчанию false. Когда ресурс передается из сборки в ответ, ссылка на другие веб-ресурсы во внедренных ресурсах может быть разрешена в это время, если значение свойства PerformSubstitution=true." В общем трудно понять о чём речь. Нашось следующее объяснение: если PerformSubstitution=true, то Обработчик WebResource.axd будет выполнять автоматическую подстановку. Это позволит вам создать встроенный ресурс, указывающий на другие встроенные ресурсы. Например, рассмотрим веб-элемент управления, использующий несколько HTML файлов для предоставления вспомогательной информации. Вы можете применять гиперссылки для подключения одного HTML файла к другому, но при этом встраивать их в виде веб-ресурсов. Без автоматической подстановки вы не сможете создать ресурс, указывающий на другой ресурс, потому что не знаете имен ресурсов, которые сгенерирует ASP.NET. Но с автоматической подстановкой можно использовать оригинальное имя файла. Компилятор заменит вашу ссылку на имя файла правильным, автоматически сгенерированным именем ресурса. В общем для графического изображения параметр PerformSubstitution указывать не нужно, он по умолчанию итак =false.
4. Теперь в коде контрола осталось получить URL встроенного ресурса изображения. Обработчик WebResource.axd принимает запросы URL, извлекает запрашиваемый ресурс из соответствующей сборки и возвращает его содержимое. Т.е. не нужно возиться с картинками и сценариями, потому что файл WebResource.axd сделает всё самостоятельно, прямо из сборки вашего элемента управления.
Следующий код берёт url изображения из текущей сборки контрола и задаёт в качестве фонового для строки заголовка текущего контрола:
|
Здесь ServControlEGridView -пространство имён контрола, EGridView имя класса контрола. Задать фон контролу можно также из .css. Ниже рассмотрен подобный случай. В общем с другими графическими изображениями можно поступать похожим образом. Вместо typeof(ServControlEGridView.EGridView) можно использовать this.GetType()
Добавление *.css во встроенные ресурсы сборкиРассмотрим добавление и использование .css файла как встроенного ресурса серверного элемента управления.
Первые 2шага такие же как и при добавлении файла изображения в ресурсы. Шаг 3. отличается наличием параметра PerformSubstitution = true -предположим, что в файле .css будут ссылки на какие-либо дополнительные ресурсы текущего контрола, например графические изображения. Добавляем строку-атрибут:
[assembly: System.Web.UI.WebResource("ServControlEGridView.eresource.css.egv.css", "text/css", PerformSubstitution = true)]
В файле .css ссылка на графическое изображение в этой же сборке может выглядеть следующим образом(селектор класса .bckgr):
|
Правило bckgr будет применено к ЛЮБОМУ элементу, атрибут CssClass которого равен 'bckgr' селектору.
4. Теперь программно в заголовок страницы добавляем ссылку на .css файл из текущей сборки. В разрабатываемый контрол добавляем следующие строки:
|
После всех этих действий можно использовать название селектора класса из .css файла, как строковый параметр для присвоения стиля тому или иному элементу текущего контрола. Например:
this.HeaderRow.CssClass = "gv_headerrow"; //Задаём стиль заголовка GridView, а точнее каждой ячейке заголовка
здесь this -текущий контрол -унаследован от GridView. gv_headerrow -селектор класса из .css файла, при помощи которого задаём стиль строки заголовка GridView.
Заголовок GridView принимает следующий вид:
По рисунку видно, что через this.HeaderRow.CssClass фон устанавливается не самому заголовку, а индивидуально каждой ячейке заголовка.
Добавление и использование .html файла в виде встроенного ресурса не производилось. Возможно там есть свои нюансы.
Добавление *.js во встроенные ресурсы сборки
Добавление, использование .js файлов, в качестве встроенных ресурсов, выглядит немного по другому. Первые три шага такие же, как и при добавлении .css файла.
4. Шаг -регистрация скрипта. На всякий случай, и для будующих применений регистрацию скриптов делаем через интерфейс IScriptControl, объявление класса контрола может выглядеть следующим образом: public class EGridView : GridView, IScriptControl
Нужно реализовать 2 функции интерфейса и добавить некоторый код в OnPreRender и Render, а также реализовать клиентский класс в .js файле.
Все таблицы стилей должны подключаться перед скриптами. Это позволит корректно объявить все свойства элементов перед выполнением кода jQuery, да и javascript в целом. Если этого не сделать, то возможна некорректная работа в некоторых браузерах, например тех, которые основаны на WebKit движке. Подобное реализовано в OnPreRender, код ниже.
Может пригодиться, при подключении, ни в какую не хотела работать jQuery библиотека. На участок javascript кода:
|
Firefox никак не реагировал, а в IE вываливалось сообщениe: "Ошибка выполнения Microsoft JScript: Объект не поддерживает свойство или метод "ready"" Причём на знак $ ругани не было. Ругань на $ была только когда jQuery совсем не был подключен.
При поиске проблемы встречалось упоминание, что mootool может конфликтовать с jQuery и нужно переходить с $ на jQuery. Но это к слову. В общем оказалось, что библиотеку jQuery в GetScriptReferences() функции интерфейса IScriptControl нужно объявлять выше/раньше остальных файлов скриптов, где возможно её применение. В общем картина в .cs файле создаваемого контрола должна быть такая:
|
jquery183min.js -переименованная jQuery библиотека должна идти первым(нулевым) элементом массива.
Код 4го шага, который относится к регистрации javascript файлов через реализацию интерфейса IScriptControl:
|
5. Описание клиентского класса: ServControlEGridView.EGridViewJ.js файл .js:
|
В подтверждение успешного подключения jQuery после загрузки страницы можем наблюдать:
Это сообщение формируемое кодом размещённым в diff.js:
|
В общем теперь можно использовать .js скрипты. И в частности jQuery.
TestICBEH_ER (VS2008 framework 3.5) -проект содержит пример реализации контрола с использованием .js файлов как встроенных ресурсов ASP.NET Server Control проекта.
Один из вариантов создания серверного контрола управления: создаём проект ASP.NET Server Control, класс контрола наследуем от расширяемого штатного элемента, например от GridView, добавляем и реализуем интерфейс IScriptControl. Создаём второй проект ASP.NET AJAX Server Control из него берём .js файл клиентского класса, как пример реализации, и помещаем его в ASP.NET Server Control проект, меняя всё что потребуется.