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】:

问题在于您的&lt;%@ Register TagPrefix="web" Namespace="CustomControls" %&gt; 标签:它错过了程序集名称!

它必须变成&lt;%@ Register TagPrefix="web" Namespace="CustomControls" Assembly="YourAssemblyName" %&gt;。如果您在查找类的程序集名称时遇到困难,这里有一些提示:

    如果您在 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# 中的自定义控件的主要内容,如果未能解决你的问题,请参考以下文章

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

ASP.NET 自定义控件 - 未知的服务器标记

将 CSS 样式表与 ASP.NET 自定义控件链接

如何设计WinForm中DataGridView控件的自定义按钮列

为啥我的自定义用户控件的子项没有被初始化?

在 WPF C# 中无法访问用户控件的自定义属性