问题
I'm onto a real head scratcher here ... and it appears to be one of the more frustrating topics of ASP.NET.
I've got an assembly that implements a-lot of custom Linq stuff, which at it's core has zero web functionality. I have an additional assembly that extends this assembly with web specific behaviour.
The web specific behaviour comes with a couple of user controls marked up inside ASCX templated UserControls.
I'm having trouble putting a nice finish on this assembly so that it is simple to redeploy for use in other applications. Let me run through what I've tried so far:
- 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.
So number 1 is just crap, number 2 doesn't give me the type support I desire and number 3 I think I'm about to produce a reasonable solution with:
- 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 theClassName
attribute in theControl
directive).
Theres also always the other option of rewriting the ASCX controls into custom controls, but just don't have the resources to consider it at the moment, and we've got no expertise in doing that, and they work fine as UserControls.
Am I missing something obvious, something maybe much simpler, or is this just purposefully difficult? I've read stories of the ASP.NET compilation process being very unfortunate in it's design on my travels across this topic.
回答1:
Well I think I've done it ... by being mindful of a few of a few annoying pitfalls with my last approach, I recommend the following when compiling ASCX user controls in a Web Application Project using a Web Deployment Project:
- 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 theaspnet_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
andobj
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 inweb.config
's<configuration><system.web><pages><namespaces>
element, tweak if you get unknown definitions appearing during the deployment process.
- Pay close attention to your assembly names, their root namespaces and deployment output assembly name- you'll get
Have some patience spare, it's quite tricky! But you do get some nice re distributable UserControls at the end of it!
Phew!
来源:https://stackoverflow.com/questions/1006086/compiling-embedding-ascx-templated-usercontrols-for-reuse-in-multiple-web-applic