25

我有一个项目,我正在尝试在页面上注册一个自定义服务器控件(没有.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!" />

我收到解析器错误,消息为“未知的服务器标记 'myControls:CustomControl'”。

我究竟做错了什么?

4

4 回答 4

45

好吧,如果这个控件在另一个类库中,或者即使它在同一个类库中,在@Register 中指定控件的程序集也不是一个坏主意:

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

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

于 2011-03-11T18:00:09.927 回答
8

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

网络配置:

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

页面.aspx:

<myCompany:ControlClassName ID="TheStuff" runat="server" ... />
于 2013-04-30T09:59:51.190 回答
5

您应该将控件放在App_Code文件夹下(如果控件不在程序集中),或者在此控件所在的位置添加对程序集的引用:

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

但猜测,你的控制不在App_Code文件夹下。

于 2011-03-11T17:59:33.210 回答
4

将程序集属性添加到您的注册标签

于 2011-03-11T18:09:48.643 回答