Microsoft KB Archive/324785

= How to share ASP.NET pages and user controls between applications by using Visual C# .NET =

Article ID: 324785

Article Last Modified on 4/28/2006

-

APPLIES TO


 * Microsoft ASP.NET 1.0
 * Microsoft ASP.NET 1.1
 * Microsoft Visual C# .NET 2002 Standard Edition
 * Microsoft Visual C# .NET 2003 Standard Edition

-



This article was previously published under Q324785



For a Microsoft Visual Basic .NET version of this article, see

825996 How to share ASP.NET pages and user controls between applications by using Visual Basic .NET



SUMMARY
This step-by-step article describes how to share Microsoft ASP.NET pages (.aspx files) and user controls (.ascx files) between applications by using Microsoft Visual C# .NET.

Requirements

 * Microsoft Windows 2000 Professional, Microsoft Windows 2000 Server, Microsoft Windows 2000 Advanced Server, Microsoft Windows XP Professional, or Windows Server 2003
 * The Microsoft .NET Framework 1.0 or the Microsoft .NET Framework 1.1
 * Microsoft Internet Information Services (IIS) 5.0 or later
 * Microsoft Visual Studio .NET

Develop the sample ASP.NET Web user control
Create one ASP.NET application that contains the shared user controls, and then create two other ASP.NET applications that incorporate the user control that are developed in the first application.

Create the ASP.NET Web application that contains the user control
 Start Visual Studio .NET. On the File menu, point to New, and then click Project. In the New Project dialog box, select Visual C# Projects under Project Types, and then select Empty Web Project under Templates. In the Location box, replace the WebApplication# default name with MyUserControls. If you are using the local server, you can use the server name http://localhost. The Location box appears as follows:

http://localhost/MyUserControls



Add a New user control
To add a new Web user control to the MyUserControls application that was created in the &quot;Create the ASP.NET Web application that contains the user control&quot; section, follow these steps:  In Solution Explorer, right-click Project, point to Add, and then click Add Web User Control.... Name the control as TimeStamp.ascx, and then click Open. The user control is displayed in the editor.  Switch to HTML view in the editor, and then replace the automatically generated template code with the following code: <%@ Control Language=&quot;c#&quot;%> void Page_Load(object sender, System.EventArgs e) { CurrentTime.Text = System.DateTime.Now.ToLongTimeString; }

Note In the earlier code sample, the AutoEventWireup attribute is not explicitly set. If the AutoEventWireup attribute is not explicitly assigned a value, the default value is true. If you use Visual Studio .NET to develop your applications, the default template code explicitly sets the AutoEventWireup attribute value to false.

Important The difference between the default value that is used by ASP.NET itself and the value that the Visual Studio .NET template code assigns to the attribute is subtle. If the AutoEventWireup attribute value is set to false, the event handlers that are declared in the .aspx page are not fired. This can be a source of confusion if you are not aware of this functionality. </li> On the File menu, click Save All.</li> On the Build menu in the Visual Studio .NET IDE, click Build Solution.</li></ol>

Create the first sample application to implement the user control
 Start Visual Studio .NET.</li> On the File menu, point to New, and then click Project.</li> In the New Project dialog box, select Visual C# Projects under Project Types, and then select ASP.NET Web Application under Templates.</li> In the Location box, replace the WebApplication# default name with MySampleDemo1. If you use the local server, you can use the server name http://localhost. The Location box appears as follows:

http://localhost/MySampleDemo1

</li></ol>

Add a new Web form
 In Solution Explorer, right-click Project, point to Add, and then click Add Web Form.....</li> Name the Web form as MyControlTester1.aspx, and then click Open.</li>  Switch to HTML view in the editor, and then add the following directive at the beginning of the page to refer the user control: <%@ Register TagPrefix=&quot;uc1&quot; TagName=&quot;TimeStamp&quot; Src=&quot;DemoControls/TimeStamp.ascx&quot; %> </li>  Add the following line of code directly after the opening <FORM> tag: <uc1:TimeStamp id=&quot;TimeStamp1&quot; runat=&quot;server&quot;></uc1:TimeStamp>                    </li> To add a reference to MyUserControls, right-click References in Solution Explorer, and then click Add Reference....</li> Click the Projects tab, and then select the MyUserControls project from the list of available projects.</li> To add the reference, click Select, and then click OK. Alternatively, you can also select Browse, and then locate the assembly in the \bin directory for the MyUserControls application.</li> <li>To save the Web form and the other associated project files, click Save All on the File menu.</li> <li>On the Build menu in the Visual Studio .NET IDE, click Build Solution.</li></ol>

Create the second sample application to implement the user control
<ol> <li>Start Visual Studio .NET.</li> <li>On the File menu, point to New, and then click Project.</li> <li>In the New Project dialog box, select Visual C# Projects under Project Types, and then select ASP.NET Web Application under Templates.</li> <li>In the Location box, replace the WebApplication# default name with MySampleDemo2. If you are using the local server, then you can use the server name http://localhost. The Location box appears as follows:

http://localhost/MySampleDemo2

</li></ol>

Add a new Web form
<ol> <li>In Solution Explorer, right-click Project, point to Add, and then click Add Web Form..... Name the Web form as MyControlTester2.aspx, and then click Open.</li> <li> Switch to HTML view in the editor, and then add the following directive at the beginning of the page to refer the user control: <%@ Register TagPrefix=&quot;uc1&quot; TagName=&quot;TimeStamp&quot; Src=&quot;DemoControls/TimeStamp.ascx&quot;     %> </li> <li> Add the following line of code directly after the opening <FORM> tag: <uc1:TimeStamp id=&quot;TimeStamp1&quot; runat=&quot;server&quot;></uc1:TimeStamp> </li> <li>To add a reference to MyUserControls, To do this, right-click References in Solution Explorer, and then click Add Reference....</li> <li>Click the Projects tab, and then select the MyUserControls project from the list of available projects.</li> <li>To add the reference, click Select, and then click OK. Alternatively, you can also select Browse, and then locate the assembly in the \bin directory for the MyUserControls application.</li> <li>To save the Web Form and other associated project files, click Save All on the File menu.</li> <li>On the Build menu in the Visual Studio .NET IDE, click Build Solution.</li></ol>

Configure the virtual directories in IIS
In the next series of steps, you create the related virtual directories in IIS to map to the physical location of the application that contains the user control. Follow these tasks for both the MySampleDemo1 and the MySampleDemo2 applications.
 * 1) Click Start, and then click Run.
 * 2) In the Open box, type inetmgr, and then click OK. Internet Information Services (IIS) Manager appears.
 * 3) In Internet Information Services (IIS) Manager, expand the root Web node, and then locate the MySampleDemo1 virtual directory. Right-click the virtual directory, point to New, and then click Virtual Directory. Virtual Directory Creation Wizard is displayed.
 * 4) Click Next.
 * 5) To create the alias for the virtual directory, type DemoControls, and then click Next.
 * 6) To map the virtual directory with a physical directory, click Browse, navigate to the MyUserControls folder, and then click Next. By default, the MyUserControls folder is located at  :\Inetpub\wwwroot.
 * 7) Click Next to accept the default settings, and then click Finish.
 * 8) Right-click the newly created DemoControls virtual directory, and then click Properties.
 * 9) On the Virtual Directory tab, click Remove. The text on the button control switches to &quot;Create&quot;. The virtual directory mapping remains the same, but does not become an application.
 * 10) Repeat steps 1-9 for the MySampleDemo2 virtual directory.

Verify that it works
<ol> <li>Open Microsoft Internet Explorer, and then go to the URL for MyControlTester1.aspx. For example, if you are developing on the local server, then the URL is as follows:

http://localhost/MySampleDemo1/MyControlTester1.aspx

You may see the page with the results of the user control.</li> <li>In Internet Explorer, go to the MyControlTester2.aspx file that is associated with the second demo application. The URL will be as follows:

http://localhost/MySampleDemo2/MyControlTester2.aspx

You may see that the page is rendered together with the output from the user control, because of the mapping scheme that you implemented in IIS.</li></ol>

Troubleshoot
While this technique works well, you must be aware of the following issues before you decide to use it: <ul> <li>The pages and the user controls are shared, but they are compiled separately for each application that uses them. Therefore, while you improve the maintainability of your sites, you do not affect the memory usage, even though you do not have several copies of the user controls.</li> <li>If the shared pages and the user controls use precompiled code-behind assemblies, you must copy the assemblies in the \bin directory of each application that uses them. Alternatively, you can sign the assemblies and then put them in the global assembly cache.</li> <li> Make sure that you not only use the @ Register directive in your .aspx page, but that the path is correctly added also. For example, in the sample for this article, the user control is located in a directory that is deeper than the .aspx page that is referencing it. Therefore, the SRC attribute of the @ Register directive appears as follows: <%@ Register TagPrefix=&quot;uc1&quot; TagName=&quot;TimeStamp&quot; Src=&quot;DemoControls/TimeStamp.ascx&quot; %> </li> <li>If you plan to reference your user control in the code-behind class file of a Web form, you must add a reference to the namespace, and then manually add the data member declaration to the user control.</li></ul>

<div class="references_section">