25

I have a project and I am trying to register a custom server control (there is no .ascx file) on the page. I am currently using

Class Declaration

namespace MyApp.Controls{
    public class CustomControl: WebControl{
        public string Text
        {
            get
            {
                String s = (String)ViewState["Text"];
                return ((s == null) ? String.Empty : s);
            }
            set
            {
                ViewState["Text"] = value;
            }
        }        
        protected override void RenderContents(HtmlTextWriter output)
        {
            output.Write(Text);
        }
    }
}

On my page,

<%@ Register TagPrefix="myControls" Namespace="MyApp.Controls" %>
<myControls:CustomControl runat="server" Text="What up!" />

I receive a Parser Error, with the message "Unknown server tag 'myControls:CustomControl'."

What am I doing wrong?

George Kagan
  • 5,207
  • 8
  • 44
  • 49
smartcaveman
  • 38,142
  • 26
  • 119
  • 203

4 Answers4

44

Well, if this control is in another class library, or even if it's in the same one, it wouldn't be a bad idea to specify control's assembly in @Register:

<%@ Register TagPrefix="myControls" Namespace="MyApp.Controls" Assembly="MyApp" %>
   <myControls:CustomControl runat="server" Text="What's up!" />

Clean and rebuild your solution too in order to verify everything is compiled rightly!

Matías Fidemraizer
  • 59,064
  • 16
  • 107
  • 181
  • No problem! Great to know you got it :) – Matías Fidemraizer Mar 11 '11 at 18:08
  • 1
    Just wondering, why using `Src` instead of `Assembly` does not work? Does this mean I need to compile my source and put the dll in bin folder? `Src` works with user control. – CookieMonster Sep 25 '13 at 04:02
  • @CookieMonster Well, you don't put the DLL in the bin folder manually.... Do you imagine using `Src` in order to tell that a regular C# class is the control? And what about the dependencies, where are coming from? Using `Src` would defeat the point of coding server controls. – Matías Fidemraizer Sep 25 '13 at 05:30
  • If it still doesn't work, you may need to specify the strong name for the assembly, which you can get by examining the assembly in the GAC. Example: assembly="MyApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5499f3feedc0ffee" instead of only assembly="MyApp". – Eccentropy Aug 21 '15 at 18:11
8

If your control will be reused on several pages, you may want to register it in web.config, as one of system.web/pages/controls subelements instead of copy-pasting the same <@Register tag in all affected pages.

web.config:

<system.web>
  <pages ...>
    <controls>
      ...
      <add tagPrefix="myCompany" namespace="MyCompany.Whatever.Controls" assembly="Whatever"/>
    </controls>

thepage.aspx:

<myCompany:ControlClassName ID="TheStuff" runat="server" ... />
demp
  • 11,841
  • 2
  • 19
  • 17
5

You should put your control either under the App_Code folder (in the case if the control not in assembly) or add a reference to assembly where this control is:

<%@ Register TagPrefix="myControls" Namespace="MyApp.Controls"
      Assembly="SomeAssembly" %>

But guessing, your control not under the App_Code folder.

Alex
  • 30,696
  • 10
  • 74
  • 131
4

Add an assembly attribute to your register tag

PMC
  • 4,578
  • 3
  • 34
  • 55