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

Posted

技术标签:

【中文标题】如何在 ASP.NET 页面上注册自定义服务器控件【英文标题】:How to register custom server control on ASP.NET page 【发布时间】:2011-07-13 16:32:06 【问题描述】:

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

我做错了什么?

【问题讨论】:

我觉得你也需要组装。 【参考方案1】:

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

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

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

【讨论】:

是的,更多细节在这里:msdn.microsoft.com/en-us/library/yhzc935f(v=VS.90).aspx 我通过添加 Assembly 属性让它工作。不需要将代码文件放在 App_Code 中【参考方案2】:

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

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

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

【讨论】:

没问题!很高兴知道你明白了:) 只是想知道,为什么使用Src 而不是Assembly 不起作用?这是否意味着我需要编译我的源代码并将 dll 放在 bin 文件夹中? Src 与用户控件一起使用。 @CookieMonster 好吧,您不会手动将 DLL 放入 bin 文件夹中......您是否想象使用 Src 来告诉常规 C# 类是控件?那么依赖关系又是从哪里来的呢?使用Src 会破坏编码服务器控件的意义。 如果还是不行,可能需要指定程序集的强名称,可以通过在 GAC 中检查程序集来获得。示例:assembly="MyApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5499f3feedc0ffee" 而不是仅 assembly="MyApp"。【参考方案3】:

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

【讨论】:

【参考方案4】:

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

web.config:

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

thepage.aspx:

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

【讨论】:

以上是关于如何在 ASP.NET 页面上注册自定义服务器控件的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET C# 中的自定义控件

如何在(asp.net)自定义服务器控件中维护状态?

ASP.NET用户自定义控件

在 asp.net 中,如何从 usercontrol 获取自定义 webcontrol 的引用?

自定义页面过滤器中的 ASP .NET Core 注入服务

asp.net怎么获取页面动态加载进来的用户自定义控件里面的值。。