如何在ASP.NET页面上注册自定义服务器控件

26

我有一个项目,正在尝试在页面上注册自定义服务器控件(没有.ascx文件)。 我目前正在使用

类声明

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);
        }
    }
}

在我的页面上,

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

我收到了一个解析器错误,提示消息为"Unknown server tag 'myControls:CustomControl'."

我错在哪里了?


1
我认为你也需要汇编。 - PMC
4个回答

46

如果这个控件在另一个类库中,甚至在同一个类库中,指定控件的程序集在@Register中是一个不错的主意。

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

也要清理并重新构建您的解决方案,以验证所有内容都已正确编译!


没问题!很高兴知道你搞定了 :) - Matías Fidemraizer
1
只是想知道,为什么使用 Src 而不是 Assembly 不起作用?这是否意味着我需要编译我的源代码并将 dll 放在 bin 文件夹中?Src 可以与用户控件一起使用。 - CookieEater
@CookieMonster 好的,你不需要手动将DLL放入bin文件夹中... 你能想象使用“Src”来告诉一个普通的C#类是控件吗?那么依赖项从哪里来呢?使用“Src”会破坏编写服务器控件的初衷。 - Matías Fidemraizer
如果仍然无法正常工作,您可能需要为程序集指定强名称,可以通过检查GAC中的程序集来获取。例如:assembly="MyApp,Version=1.0.0.0,Culture=neutral,PublicKeyToken=5499f3feedc0ffee"而不是只有assembly="MyApp"。 - Eccentropy

8
如果您的控件将在多个页面上重复使用,您可能希望将其注册在web.config中,作为system.web/pages/controls子元素之一,而不是在所有受影响的页面上复制粘贴相同的<@Register标记。
web.config:
<system.web>
  <pages ...>
    <controls>
      ...
      <add tagPrefix="myCompany" namespace="MyCompany.Whatever.Controls" assembly="Whatever"/>
    </controls>

thepage.aspx:

<myCompany:ControlClassName ID="TheStuff" runat="server" ... />

6

如果控件不在程序集中,您应该将其放在App_Code文件夹下,或者添加对包含此控件的程序集的引用:

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

但是我猜测你的控件不在 App_Code 文件夹下。

1
是的,更多细节请参考这里:http://msdn.microsoft.com/en-us/library/yhzc935f(v=VS.90).aspx - Cosmin
1
我通过添加Assembly属性使其正常工作。将代码文件放置在App_Code中并不是必要的。 - smartcaveman

5
在你的注册标签中添加一个程序集属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接