ASP.NET C# 中的自定义控件
Posted
技术标签:
【中文标题】ASP.NET C# 中的自定义控件【英文标题】:Custom Control in ASP.NET C# 【发布时间】:2011-03-01 12:10:57 【问题描述】:我创建了一个简单的自定义控件,它只继承自Literal
控件,还没有任何扩展,代码为空。
命名空间:自定义控件
类名:字面量:System.Web.UI.WebControls.Literal
接下来我在aspx
页面中注册此控件,如下所示:
<%@ Register TagPrefix="web" Namespace="CustomControls" %>
(我在一些教程中读到这是注册它的方法之一,除了 web.config 等)
毕竟,对我来说没有智能,更糟糕的是 - 当我尝试运行包含控件的页面时,我得到一个解析错误“未知的服务器标签:web”。
如果需要此信息,我使用的是“创建新项目”而不是新网站。
我的问题可能是什么?
提前致谢。
【问题讨论】:
“创建新项目”到底是什么意思?文件 -> 新建 -> 项目 -> ...(至少在 VS 2005 中)然后,你有什么想法?这可能很重要(即您是否选择了其他语言 -> Visual C# -> Web -> 其他?)。而且您确实需要在某个时候进行组装;问题是您是否必须明确命名它(如果您没有使用“网站”项目,因为您没有 App_Code 文件夹,我认为您必须这样做)。 你的自定义控件类存在哪里?是网站项目中的class文件还是自己项目中的? 那么您有两个项目,一个用于“CustomControls”,另一个用于 Web 项目? @scherand :我认为他的意思是他是作为一个 Web 应用程序项目而不是作为一个网站项目来做的。两者的行为略有不同。 VS2008中WebApplicationProject出现问题 【参考方案1】:我是这样做的,从无到有一步一步地做。第一种方法使用第二个项目/程序集。对于 App_code 版本向下滚动。
Web应用项目方法
-
创建一个新的 ASP.Net Web 应用程序。记下名字,我的叫 WebApplication2。如果您已经有一个现有的 Web 应用程序(很可能),请双击项目的属性部分并检查“程序集名称”属性,并记下它。
在 Web 应用程序中创建一个名为 Literal.cs 的新类
在类定义中加入类似如下的代码:
namespace CustomControls
public class Literal : System.Web.UI.WebControls.Literal
将以下注册标签添加到您的 aspx 页面顶部
如果您的程序集名称不同,请在此处更改。我注意到当我在 VB.Net 中执行此操作时,命名空间是 WebApplication1.CustomControls 而不是像在 C# 中那样只是 CustomControls,有点奇怪。
将新控件添加到您的页面:
单独项目法
-
创建一个新的空网站 (ASP.Net)。
向解决方案添加一个名为 CustomControls 的新 ASP.Net 服务器控件库。
在名为 Literal 的新项目中添加一个新类(我使用的是 C#,因此我的文件名为 Literal.cs)。以下是我的超级基本代码,我认为应该与问题中描述的代码相匹配。
namespace CustomControls
public class Literal : System.Web.UI.WebControls.Literal
向您的网站添加对 CustomControls 项目的引用。
将程序集注册添加到您的 aspx 页面顶部:
将控件的新实例添加到您的页面:
在 App_Code 方法中
-
创建一个新的空网站 (ASP.Net)。
向 App_Code 文件夹 Literal2 添加一个新类(我使用的是 C#,因此我的文件名为 Literal2.cs)。下面是我的超级基本代码,我认为应该与问题中描述的代码相匹配。我将其命名为 2,以便您可以将其与上述方法结合使用而不会出现编译错误
namespace CustomControls
public class Literal2 : System.Web.UI.WebControls.Literal
在您的 aspx 页面中注册 app_code 的程序集/命名空间,方法是在顶部添加以下行
将新控件的实例添加到您的页面:
我使用 Visual Studio 对此进行了测试,对我来说一切正常。
【讨论】:
感谢您提供详细信息,这在网站项目中完美运行。问题出在 VS2008 中的 WebApplicationProject 上。 @Mahes - 我已更新我的答案以包括 Web 应用程序方向(它们位于顶部)。 @Mahes - 如果我发布的代码对您不起作用,请告诉我。【参考方案2】:如果您想在其他页面上使用它,也可以在 web.config 中注册您的控件
<pages>
<controls>
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add tagPrefix="web" namespace="MyProject.CustomControls" assembly="MyProject" />
</controls>
</pages>
对于网站,这将起作用
<add tagPrefix ="web" namespace="ASP.App_Code.CustomControls" />
【讨论】:
感谢您的回复,问题是-我还没有任何程序集文件,据我了解,即使没有程序集,也只能通过标记前缀和命名空间注册控件。我说的对吗? 如果您创建了一个 Web 应用程序项目,您将拥有一个程序集,请参阅:dl.dropbox.com/u/6561262/project-settings.png【参考方案3】:问题在于您的<%@ Register TagPrefix="web" Namespace="CustomControls" %>
标签:它错过了程序集名称!
它必须变成<%@ Register TagPrefix="web" Namespace="CustomControls" Assembly="YourAssemblyName" %>
。如果您在查找类的程序集名称时遇到困难,这里有一些提示:
-
如果您在 Web 应用程序的 Visual Studio 项目中或在单独的 DLL(共享库)项目中创建了该类,则右键单击该项目并转到“属性”以获取程序集名称
如果您在 App_Code 目录中创建了 .cs 文件,
ASP.App_Code
应该可以工作
否则请给我们一些关于项目布局的信息!
【讨论】:
谢谢。即使指定程序集名称也不能解决 VS2008 中 WebApplicationProject 的问题【参考方案4】:最简单的做法是将 Literal.ascx 拖放到页面上(如果页面在同一个解决方案中)。如果页面是另一个解决方案,您可以将控件添加到 VS 工具箱并将控件拖放到页面上。
【讨论】:
【参考方案5】:你忘记了 src 属性。
<%@ Register TagPrefix="web" Namespace="CustomControls" Src="PathToYourCustomControl" %>
【讨论】:
以上是关于ASP.NET C# 中的自定义控件的主要内容,如果未能解决你的问题,请参考以下文章