如何在 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 页面上注册自定义服务器控件的主要内容,如果未能解决你的问题,请参考以下文章