【发布时间】:2008-12-29 20:11:52
【问题描述】:
我正在考虑构建一些 Web 用户控件,着眼于重用,但我似乎无法在 VS2008 的类库中添加 Web 用户控件。有没有办法解决这个问题,或者有没有更好的方法来创建可重用的控件?
【问题讨论】:
标签: asp.net web-controls
我正在考虑构建一些 Web 用户控件,着眼于重用,但我似乎无法在 VS2008 的类库中添加 Web 用户控件。有没有办法解决这个问题,或者有没有更好的方法来创建可重用的控件?
【问题讨论】:
标签: asp.net web-controls
您可以创建封装所需功能的 Web 用户控件 或 Web 自定义控件。这两个控件的主要区别在于易于创建与设计时的易用性。
您或许应该考虑创建一个 Web 自定义控件库。有一个walkthrough for creating a web custom control using the Web Control Library template。
根据 MSDN 文章“Recommendations for Web User Controls vs. Web Custom Controls”,这些是两种控件之间的区别:
网络用户控件易于制作, 但它们使用起来不太方便 在高级场景中。你开发网络 用户控件几乎完全相同 开发 Web 表单页面的方式。 与 Web 窗体一样,用户控件可以是 在视觉设计师中创建,他们 可以用代码分开编写 从 HTML,他们可以处理 执行事件。
但是,因为网络 用户控件是动态编译的 在运行时它们不能被添加到 工具箱,它们被表示 通过一个简单的占位符字形当 添加到页面。这使得 Web 用户 控制更难使用,如果你是 习惯了完整的 Visual Studio .NET 设计时支持,包括 属性窗口和设计视图 预览。
另外,分享的唯一方式 应用程序之间的用户控制 是在每个中放置一个单独的副本 应用程序,这需要更多 如果您对 控制。
Web 自定义控件是编译后的代码, 这使它们更易于使用,但 更难创造;网页定制 控件必须用代码编写。 创建控件后, 但是,您可以将其添加到工具箱 并在视觉设计器中显示 具有完整的属性窗口支持 以及所有其他设计时功能 ASP.NET 服务器控件。
另外,您可以安装单个 Web 自定义控件的副本 全局程序集缓存并共享它 应用程序之间,这使得 维护更容易。更多 信息见全局程序集缓存。
【讨论】:
按照以下步骤(来自 Phil Haacked 的 this post):
关闭 VS.NET 2005。
打开目录 C**:\Program Files\Microsoft Visual Studio 8\Web\WebNewFileItems\CSharp**(假设默认安装 VS.NET)。
在记事本中打开 CSharpItems.vsdir 文件。选择文本并将其复制到剪贴板。
现在打开文件 C:\Program Files\Microsoft Visual Studio 8\VC#\CSharpProjectItems\CSharpItems.vsdir 并将剪贴板的内容粘贴到现有文本下方。
现在,当您选择添加 | 时,“Web 用户控制”应该是一个选项。新物品。
参考:http://haacked.com/archive/2006/02/07/addingwebusercontroltoaclasslibraryinvs.net2005.aspx
【讨论】:
正如 platte 的链接所提到的,如果您要重复使用,那么 Web 用户控件不是很好。必须手动将 ascx 文件复制到您要在其中使用它们的每个项目中,否则您必须自行破解。
最好使用 System.Web.UI.WebControls.WebControl,这是您在添加“ASP.NET 服务器控件”时得到的。这些是为重用而设计的。如果现有的框架控件之一在很大程度上符合要求,并且您只需要扩展它的功能,那么添加一个“ASP.NET 服务器控件”并将其更改为从 Panel 或 Menu 或其他继承。
如果您仍然决心让可重复使用的 Web 用户控件发挥作用,那么 this article by The Gu 应该会让您走上正确的道路。
【讨论】:
我假设您可以使用一个名为“ASP.NET 服务器控件”的项目模板...
--larsw
【讨论】:
你可以在类库中做任何事情。
就是这样。您现在拥有一个可重用的 ASP.NET 控件。
你可以做一些特殊的事情,比如为你的类和属性添加属性,但它们实际上是不需要的。
[DefaultProperty("Text")]
[Category("...")]
[DefaultValue("")]
【讨论】:
您可以使用虚拟路径提供程序,但您应该考虑它是否真的值得您尝试。在这个主题上考虑这个codeproject article。
【讨论】: