Вопрос по ascx, asp.net, web-deployment-project, virtualpathprovider – Компиляция / встраивание пользовательских элементов управления ASCX для повторного использования в нескольких веб-приложениях

4

Я нахожусь здесь на самом деле, чтобы почесать голову ... и это, кажется, одна из самых разочаровывающих тем ASP.NET.

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

Поведение, специфичное для Интернета, сопровождается парой пользовательских элементов управления, размеченных внутри шаблонных пользовательских элементов управления ASCX.

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

Copied the ASCX files to the consuming web application using build events; far from ideal and quite a deployment nightmare. Implemented a custom VirtualPathProvider and embedded the ASCX templates within the assembly as embedded resources. Unfortunately when using the Register directive in the consuming application it creates the designer declaration as a UserControl, where I would require a declaration of the actual control type; unforeseen (typically) and undesirable. Created a Web Deployment Project to compile the UserControls, but the compiled user controls then become part of another assembly, and no longer descend from the class definitions in my web assembly--the assembly needs to instantiate them dependent on the request context.

Таким образом, номер 1 - просто дерьмо, номер 2 - не дает мне поддержку типа, которую я желаю, и номер 3, я думаю, я собираюсь найти разумное решение с помощью:

Lump all non-control classes into the App_Code folder, prepare a factory class that will construct an object of the desired control type using reflection and the expectation that the type being reflected will be present in the deployment output (hopefully guaranteed by the presence of the ClassName attribute in the Control directive).

Также всегда есть другая возможность переписать элементы управления ASCX в пользовательские элементы управления, но у нас просто нет ресурсов для их рассмотрения на данный момент, и у нас нет опыта в этом, и они отлично работают как UserControls.

Я упускаю что-то очевидное, что-то, может быть, намного проще, или это просто целенаправленно сложно? Я читал истории о том, что процесс компиляции ASP.NET очень неудачен в его дизайне во время моих путешествий по этой теме.

Ваш Ответ

1   ответ
2

Ну, я думаю, что я сделал это ... помня о некоторых из нескольких досадных ловушек с моим последним подходом, я рекомендую следующее при компиляции пользовательских элементов управления ASCX в проекте веб-приложения с использованием проекта веб-развертывания:

  1. Avoid putting classes in App_Code unless they're standalone or helper classes, ASP.NET treats this as a speshul folder, the meaning of which is lost on me, mayhem, confusion and chaos follows. Code in this folder does get output in the Web Deployment Project, though.
    • Pay close attention to your assembly names, their root namespaces and deployment output assembly name- you'll get access is denied errors if you have any naming conflicts during the aspnet_merge process.
    • Ultimately you'll most likely end up deploying 2 assemblies, I tried to create only one but the deployment output was still pointing to type definitions in the source assembly. This isn't a problem if you don't have any other types in your Web Application Project--I have so it was a problem for me. In my case, my final output was:
    • <Organisation>.<TechnologyName>.Web.DLL - Compiled Web Application Assembly (containing the ASCX templates)
    • <Organisation>.<TechnologyName>.Web.UI.DLL - ASP.NET Compiled UserControl assembly, created by Web Deployment Project
    • Clean often, and check that the Web Application Project's bin and obj paths are cleared of any previous junk built when you perhaps hadn't finalised your namespace or assembly naming scheme--the Web Deployment Project will be quite keen to include these, causing a fine mess.
    • Check your imported namespaces, the ASP.NET compiler likes to refer to the Import directive in the ASCX template, and it also considers imported namespaces present in web.config's <configuration><system.web><pages><namespaces> element, tweak if you get unknown definitions appearing during the deployment process.

Имейте немного терпения, это довольно сложно! Но в конце вы получите несколько хороших распространяемых UserControls!

Уф!

Похожие вопросы