Поделиться страницей 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)