我们何时会在Web自定义控件上使用Web用户控件?
有人可以解释何时使用这些工具吗?在许多情况下,它们几乎可以互换。
自定义控件被添加到工具栏,而用户控件(ascx)则不能。自定义控件不会在设计器中呈现,而用户控件则会在设计器中呈现。除此之外,我们如何选择最适合使用的一种呢?
另外,我也在寻找从JavaScript(GetElementById)访问控件的最佳方法。因此,在正确的方向上增加客户端支持是很重要的。
解决方案
这是从Microsoft的网站:
网络用户控件
- 易于创建
- 对使用视觉设计工具的消费者的支持有限
- 每个应用程序都需要单独的控件副本
- 无法添加到Visual Studio中的工具箱
- 适合静态布局
Web自定义控件
- 难以创建
- 面向消费者的全面视觉设计工具支持
- 全局程序集缓存中仅需要控件的单个副本
- 可以添加到Visual Studio中的工具箱
- 适用于动态布局
http://msdn.microsoft.com/zh-CN/library/aa651710(VS.71).aspx
为了从JavaScript访问它们,我们应该使用document.GetElementById('<%= TheControl.ClientID%>')
。
Web控件和用户控件之间的区别在于,用户控件具有带有html定义的ascx文件,而Web控件则没有。这是造成其他差异的原因。另外,对于用户控件,我们不能使用new Control()
,而需要使用LoadControl
,因为这会加载.ascx。
对于继承自.Net控件的简单控件(例如带有验证的文本框或者类似的控件),我倾向于使用Web控件。对于带有html和内部控件的更复杂的控件,我倾向于使用用户控件。但这基本上是个人喜好。
我认为我们在想的是自定义控件与用户控件,两者都是Web控件。用户控件没有设计器UI,而自定义控件可以。
通常,我们使用UserControls将UI划分为不同的功能区域。但是,如果我们创建要在多个解决方案中使用的功能,则通常会将它们创建为"自定义控件"。
只能将自定义控件添加到工具箱。
这是微软的摘录:
http://msdn.microsoft.com/zh-CN/library/aa651710(VS.71).aspx
UserControl必须由网站托管,并使用代码隐藏模型与ASCX文件关联。因此,使用用户控件,我们可以在ASCX文件中定义该控件的基本标记,并将所有代码放入ASCX.CS文件中。
WebControl只是一个类,并且不允许我们定义关联的ASCX文件;我们需要覆盖"渲染"功能以打印出控件将要产生的任何标记。但是,由于它不依赖ASCX,因此可以放入共享库中。 (一个DLL)
回答问题:Web和UserControl都具有相同的好处,它们占用页面的一部分并将其封装。当相关代码仅适用于我的一个网站时,我使用UserControls。如果在多个站点中使用相似的代码,则将代码转换为WebControl并将其移至共享库中。这样,当我需要更新它时,我只在一个地方而不是3或者4进行更改。
提示:通过从标准ASP WebControl之一继承,可以避免定义自己的WebControl的麻烦。许多标准控件(例如Label或者Image)不是密封的,我们可以从它们继承并重写其方法以创建自己的专用控件版本。与直接扩展WebControl相比,这要容易得多,并且出错的可能性较小。
简单的:
UserControl:
- UserControl需要* .ascx文件来完成实例初始化。因此,我们不能从另一个UserControl派生。
- UserControl具有* .ascx文件,因此我们可以轻松编写HTML。并且(最大的优势)我们可以更改文件的内容* .ascx,并在Web应用程序运行时更改控件的外观。
WebControl:
- WebControl是程序集中的"唯一"类,因此我们可以从它们派生另一个控件。
- WebControl没有* .ascx(或者另一个)文件,没有人不能更改此控件的外观(例如,不合格的Web管理员)。
这不是真的。 Web控件就像一个按钮,我们可以为其构建一个设计器,以便在设计器模式下进行渲染。
主要区别在于Web控件是原子单位。它应该像Visual Studio中所有其他默认服务器控件(包括设计器模式)一样工作。此外,它完全是用代码构建的,并存储在DLL中(即它没有html面,也没有任何内容发布到网站上)。
用户控件是ASP Include的.NET版本。有一个html代码段及其相应的代码隐藏页面。在发布过程中,有一个ASCX文件被推送到网站上。另外请注意,这些控件比服务器控件更易于开发。
这个比那个好吗?这取决于目标是什么。但总的来说,如果我们要构建供其他人/项目使用的内容,请使用webcontrol。如果我们要为自己项目的使用量而构建东西,请使用用户控件。
现在,就JS而言,这很难描述,并且需要进行大量讨论。对于服务器控件,我们需要为JS提供挂钩,以获取每个内部控件的客户端ID。使用用户控件时,我们可以直接在用户控件上编写JS,并以与ASPX页面相同的方式访问控件。
用户控件随项目一起编译,并且必须使用与项目相同的语言编写。
自定义控件可以放置在画布上,并可以通过设置属性进行配置,而无需程序员知道所有内部信息(好坏)。另外,由于自定义控件是在dll中预编译的,因此无需使用与项目相同的语言编写。
如果注意细节,可以将"自定义"控件编写为在设计器中显示(尽管这样做可能并不值得)。
用户控件
- 易于实现,因为我们可以在标记部分上直观地拖放其他控件。
- Visual Studio中良好的设计器支持
- 只能在同一项目中重复使用
- 我们还可以根据需要创建模板化的用户控件(尽管不那么常用)
自定义服务器控件
- 创建一个复合控件
- 制作模板化的+数据绑定的控件
- 在其他项目中具有很高的可重用性
- 制作可在公司范围内使用的框架的理想选择