Библиотека User Controls в dll на ASP.NET

Кажется, совершенно очевидно, что в больших веб-проектах необходимо выделять отдельные пользовательские элементы управления в отдельную библиотеку. Например, представим сайт, который управляется из нескольких админок – допустим, одна для управления контентом для менеджеров, другая – для финансистов, выводящая всякую статистику, а третья – для очкастых программеров, позволяющая настраивать хитрые параметры, которые остальным пользователям не нужны. Наверняка у всех трех админок будет общая часть DAL (функций, выбирающих информацию из базы данных) и отдельные пользовательские элементы управления (компонент авторизации, страница управления профилем пользователя). Если первое «впихнуть» в библиотеку совсем несложно (проект Class Library в Visual Studio), то с юзерконтролами придется попыхтеть.

Привожу последовательность шагов по созданию библиотеки User Controls. Шаманство началось. Поехали.

Подготовительные работы

Устанавливаем Visual Studio 2008 Web Deployment Projects. Берется компонент отсюда.

Перезапустив Visual Studio и убедившись, что в сплэш-скрине показывается новый компонент Web Deployment Projects, создаем новый solution c двумя сайтами. Первый назовем MyLib, второй – MyTestSite. Из названий очевидно, для чего нам нужен каждый из них. В выпадающем меню проекта MyLib, выбираем новый пункт Add Web Deployment Project.

wd

Далее настроим последовательность компиляции проектов. Заходим в свойства солюшна и устанавливаем для проекта MyTestSite зависимость от MyLib_deploy.

prop

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

Настраиваем библиотеку

Заходим в свойства проекта MyLib_deploy и устанавливаем:

  • На вкладке Compilation снимаем галку с Allow this precompiled site to be updatable (мы же хотим все содержимое в одной dll), а заодно запоминаем место, куда будет сохранена собранная библиотека.

    prod_depl
  • На вкладке Output Assemblies вводим имя сборки (оно же название будущего файла dll) и устанавливаем галку Treat as library component (в этом случае вся библиотека разместится в одном файле длл).

    prod_depl2
  • На вкладке Deployment ставим флаг Remove the App_Data folder from output location. Обойдемся без нее. :)

    prod_depl3

Теперь проверим себя. Скомпилируем MyLib_deploy. Если в папке MyLib_deploy\bin\Debug\ появился файл MyCompany.MyLib.dll, то пол-дела уже сделано. Можно поздравить себя.

Создаем User Control .. по хитрому

Здесь начинается самое неочевидное, то, ради чего писалась вся эта статья.

1. Добавляем новый Web User Control, назвав его Hello.ascx.

2. В файле Hello.ascx.cs переименовываем класс в HelloControl, и оборачиваем его в пространство имен MyCompany.MyLib.

[cc lang="csharp"]
namespace MyCompany.MyLib
{
public partial class HelloControl : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
}
[/cc]

3. В Hello.ascx заменяем
[cc lang="asp"]
<%@ Control Language="C#" AutoEventWireup="true"
CodeFile="Hello.ascx.cs"
Inherits="Hello" %>
[/cc]
на
[cc lang="asp"]
<%@ Control Language="C#" AutoEventWireup="true"
ClassName="MyCompany.MyLib.Hello"
CodeFile="Hello.ascx.cs"
Inherits="MyCompany.MyLib.HelloControl" %>
[/cc]

Мы только что задали отдельное имя Hello классу визуальной части пользовательского элемента управления («Hello») и унаследовали его от класса-обработчика («HelloControl»). В интерфейсе библиотеки, к сожалению, будут видны оба класса, но использовать мы будем только один – Hello. В дальнейшем, все остальные компоненты будем называть по аналогии – визуальный класс – Name, обработчик – NameControl.

4. Добавляем в Hello.ascx какие-то компоненты asp.net, реализуем функционал. Пусть будет, например, вот так:
[cc lang="asp"]
<%@ Control Language="C#" AutoEventWireup="true"
ClassName="MyCompany.MyLib.Hello"
CodeFile="Hello.ascx.cs"
Inherits="MyCompany.MyLib.HelloControl" %>


[/cc]

Тестируем

Перекомпилируем библиотеку и добавим ее в проект MyTestSite. Внимание, добавляем dll с названием MyCompany.MyLib.dll из папки bin проекта MyLib_deploy, но не из MyLib!

addref

Добавляем в web.config MyTestSite в раздел system.web -> pages -> controls строку:
[cc lang="asp"]

[/cc]
и перекомпилируем весь солюшн.

Добавляем компонент на страницу тестового проекта:

myc

Помним, что нас интересует только компонент Hello. Про HelloControl забываем, закрываем глаза, делаем вид, будто его с нами нет. В результате, получается следующий код:
[cc lang="asp"]


[/cc]

В браузере результат выглядит следующим образом:

inbrowser

Что мы и хотели увидеть. Ура, наши страдания не прошли даром!

Запись опубликована в рубрике Программирование с метками , , . Добавьте в закладки постоянную ссылку.

Комментарии запрещены.