Поделиться страницей aspx между проектами

У нас есть решение с несколькими веб-проектами, и есть несколько страниц, которые должны присутствовать в нескольких из них. Поэтому нам нужен какой-то общий проект, который содержит файлы aspx и на которые можно ссылаться другими веб-проектами.

Теперь есть несколько реализаций:

Одна реализация описанная ScottGu, которая включает в себя создание общего проекта, а не копирование вывода aspx в проект-хост и ссылку на dll из aspx. Этот метод имеет тот недостаток, что при изменении апкса он должен быть восстановлен.

Другим вариантом, основанным на сообщением Дэвида Эббо, было бы преобразование aspx в ascx-es, на которые можно ссылаться как пользовательские элементы управления, и чем включать эти custom-control-aspx-es в проект-хост внутри некоторых страниц-заполнителей. Но мои проблемы: могут ли все страницы apsx превращаться в ascx? Я имею в виду, что в пользовательских элементах управления, например, отсутствует событие Page.LoadComplete.

И еще один вариант - использовать виртуальные каталоги, которые отображаются в общий веб-проект, как описано в статье Microsoft KB. Проблема снова в этом методе заключается в том, что общие aspx-es должны быть в предопределенных каталогах (то есть в виртуальном каталоге). Если имя виртуального каталога перекрывает физический каталог, виртуальный его переопределяет, и никакие страницы из последнего не могут быть использованы. Возможно ли слияние этих двух?

Любые мысли? заранее спасибо Постскриптум Как насчет отладки общих страниц?

Ответ 1

Я решил эту проблему, создав общую библиотеку классов, содержащую элементы управления .ascx. Не удалось найти реальные трудности при преобразовании с .aspx-страниц в .ascx-элементы управления. Нашел этот образец ScottGu действительно простым и хорошим местом для начала. http://webproject.scottgu.com/CSharp/usercontrols/usercontrols.aspx.

Ответ 2

Решение, которое мы используем, метод ScottGu, который включает в себя копирование aspx файлов из общего проекта в проекты-хосты.

Событие post build в общем проекте копирует файлы на свое место, например

xcopy "$(ProjectDir)Forms\Techs\AddEditTech.aspx" "$(SolutionDir)..\TTAdmin\Forms\Companies"  /i /d /y
if errorlevel 1 goto BuildEventFailed

xcopy    ....

goto BuildEventOK

:BuildEventFailed
echo POSTBUILDSTEP for $(ProjectName) FAILED
exit 1

:BuildEventOK
echo POSTBUILDSTEP for $(ProjectName) COMPLETED OK

Ответ 3

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

Ответ 4

Вы рассматривали развитие, ориентированное на обслуживание? Постройте функциональность в сервисах, которыми вы можете поделиться. Создайте свою функциональность, например, виджеты. Таким образом, у вас есть только одна база кода, но вы можете использовать ее на нескольких сайтах.

Подумайте, вне поля (.Net)