Reputation: 4915
I am looking for a link to instructions or a walkthru for Creating Custom Controls in Asp.net 3.5.
I have already looked at the following :
http://forums.asp.net/t/1385382.aspx : Turning an .ascx User Control into a Redistributable Custom Control asp.net 3.5
http://msdn.microsoft.com/en-us/library/aa479318.aspx : Turning an .ascx User Control into a Redistributable Custom Control asp.net 2.0
I think the two above links are for Composite Custom Controls which would be fine for now, as it seems it is easier to make a Composite rather than a full Custom control.
As per the instructions in the above link ( aa479318 ) , I created a user control MyControl.ascx file and published it, which was compiled it into a self contained .dll which was named App_Web_MyControl.ascx.cdcab7d2.
Then I put a
<%Register Assembly="App_Web_MyControl.ascx.cdcab7d2"
TagPrefix="cc" namespace="TheNamespace" %>
in the aspx file (in another app) where I wanted to use the Custom Control, and I add a reference to the .dll assembly in the project.
The CustomControl name is not being recognized when I try creating it in the .aspx code by
<cc:MyControl ID="idname" runat="server" />
I get error Element 'MyControl' is not a known element.'
Upvotes: 3
Views: 3044
Reputation: 2738
This is late, I know, but here goes..
I successfully turned an .ascx UserControl into a redistributable dll by doing this:
Published the Website project with only these settings ticked in the Publish Web Site dialog:
Use fixed name and single page assemblies
Emit debug information
Note how it is registered in web.config using namespace="ASP", and how the tag on the web page has a few underscores in it <MyPrefix:app_usercontrols_radiobuttonquestion_ascx /> This may be the key to where you're going wrong?
This worked well for me, although it took me AGES to figure out. It's probably easier to just build a server control or composite control, unless your UI is very complex.
Hope this helps somebody.
Upvotes: 2
Reputation: 933
Take a look at Scott's Post on Registration as this will allow you to register your UserControl, which you have converted into a custom control inside your web.config. This allows you to set the tag name of the control as well since the actual name of your class probably got mangled in the generated App_Web_MyControl.ascx.cdcab7d2 dll.
This hopefully allows you to do something like the following...
<?xml version="1.0"?>
<configuration>
<system.web>
<pages>
<controls>
<add tagPrefix="cc" assembly="App_Web_MyControl.ascx.cdcab7d2" tagName="MyControl"/>
</controls>
</pages>
</system.web>
</configuration>
...thus sidestepping your class name "MyControl" issues.
The other option is to use the .Net Reflector to go inside your App_Web_MyControl.ascx.cdcab7d2 assembly (shouldn't have said dll earlier) and figure out what "MyControl" got changed to. This is a bit uglier since this generated name is likely to change anytime you recompile your App_Web_MyControl
Upvotes: 0
Reputation: 58261
If I were you, I would start here:
Create a project of type "ASP.Net Server Control." It should create a class that looks like this (my class is called ServerControl):
[DefaultProperty("Text")]
[ToolboxData("<{0}:ServerControl1 runat=server></{0}:ServerControl1>")]
public class ServerControl1 : WebControl
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
public string Text
{
get
{
String s = (String)ViewState["Text"];
return ((s == null) ? "[" + this.ID + "]" : s);
}
set
{
ViewState["Text"] = value;
}
}
protected override void RenderContents(HtmlTextWriter output)
{
output.Write(Text);
}
}
You can then add fields and properties and methods (public, private, or protected). If you don't want to override the RenderContents method, you can create a composite control by overriding the CreateChildControls method (see this example).
Look into the HtmlTextWriter class for more information on what to do in the RenderContents method above.
Upvotes: 0