何时将 Web 用户控件用于 Web 自定义控件?

When would you use a Web User Control over a Web Custom Control?

提问人:Mike 提问时间:9/23/2008 最后编辑:RayMike 更新时间:7/2/2010 访问量:6947

问:

有人可以解释何时使用其中的每一个吗?在许多情况下,它们似乎几乎可以互换。

自定义控件将添加到工具栏,而用户控件 (ascx) 则不能。自定义控件不会在设计器中呈现,而用户控件会呈现。除此之外,您如何选择使用哪个是正确的?

此外,我正在寻找从 JavaScript (GetElementById) 访问控件的最佳方法。因此,在正确方向上添加客户端支持会很棒。

asp.net 控制 客户端 Web 用户控件

评论


答:

10赞 AaronS 9/23/2008 #1

这是来自Microsoft的网站:

Web 用户控件

  • 更易于创建
  • 对使用视觉设计工具的消费者的支持有限
  • 每个应用程序都需要单独的控件副本
  • 无法添加到 Visual Studio 中的“工具箱”中
  • 适用于静态布局

Web 自定义控件

  • 更难创造
  • 完整的视觉设计工具支持 消费者
  • 只有控件的单个副本是 必需,在全局程序集中 缓存
  • 可以添加到工具箱中 Visual Studio的
  • 适合动态布局

http://msdn.microsoft.com/en-us/library/aa651710(VS.71).aspx

0赞 configurator 9/23/2008 #2

要从 JavaScript 访问它们,您应该使用 .
Web 控件和用户控件之间的区别在于,用户控件具有具有 html 定义的 ascx 文件,而 Web 控件则没有;这就是造成其他分歧的原因。此外,对于不能使用的用户控件,需要改用,因为这会加载 .ascx。
对于继承自 .Net 控件的简单控件,例如带有验证的文本框或类似的东西,我倾向于使用 Web 控件;对于带有 html 和内部控件的更复杂的控件,我倾向于使用用户控件。但这基本上是你的个人喜好。
document.GetElementById('<%=TheControl.ClientID%>')new Control()LoadControl

评论

0赞 Stephen Wrighton 9/23/2008
此示例并不总是适用于 Web控件。例如,假设 Webcontrol 生成两个 textarea、一个标签和一个按钮,它们都包装在一个 span 标记中?
0赞 Mike 9/23/2008
这就是我遇到的问题。当控件包含其他控件时,如何访问控件?
1赞 Jason Stevenson 9/23/2008 #3

我认为您想到的是自定义控件与用户控件,两者都是 Web 控件。用户控件没有设计器 UI,而自定义控件可以。

通常,我们使用 UserControls 将 UI 分成不同的功能区域。但是,如果我们创建要跨多个解决方案使用的功能,我们通常会将它们创建为自定义控件。

只能将自定义控件添加到工具箱中。

以下是Microsoft的摘录:

http://msdn.microsoft.com/en-us/library/aa651710(VS.71).aspx

3赞 The Digital Gabeg 9/23/2008 #4

UserControl 必须由网站承载,并使用代码隐藏模型与 ASCX 文件相关联。因此,使用用户控件,可以在 ASCX 文件中定义控件的基本标记,并将所有代码放入ASCX.CS文件中。

WebControl 只是一个类,不允许您定义关联的 ASCX 文件;您需要重写 Render 函数以打印出控件将要生成的任何标记。但是,由于它不依赖于 ASCX,因此可以将其放入共享库中。(一个 DLL)

回答您的问题:Web 控件和 UserControls 具有相同的优点 - 它们获取页面的某些部分并将其封装。当相关代码仅适用于我的一个站点时,我使用 UserControls;如果我在多个站点中使用类似的代码,则会将代码转换为 WebControl 并将其移动到共享库中。这样,当我需要更新它时,我会在一个地方进行更改,而不是 3 或 4 个。

提示: 您可以通过从标准 ASP WebControl 之一继承来绕过定义自己的 WebControl 的一些麻烦。许多标准控件(如 Label 或 Image)未密封 - 你可以从它们继承并重写它们的方法,以创建该控件的专用版本。这比直接扩展 WebControl 要容易得多,也不容易出错。

0赞 TcKs 9/23/2008 #5

简单:

用户控制:

  • UserControl 需要 *.ascx 文件才能完成实例初始化。因此,您不能从一个 UserControl 派生另一个 UserControl。
  • UserControl 具有 *.ascx 文件,因此您可以轻松编写 HTML。并且(最大的优点)您可以更改文件的内容 *.ascx,并在 Web 应用程序的运行时更改控件的外观。

网络控制:

  • WebControl 是程序集中的“唯一”类,因此可以从中派生另一个控件。
  • WebControl 没有 *.ascx(或其他)文件,没有人可以更改此控件的外观(例如,不合格的 Web 管理员)。
0赞 Stephen Wrighton 9/23/2008 #6

这并不完全正确。Web控件就像一个按钮,你可以为它构建一个设计器,以便它以设计器模式呈现。

主要区别在于 webcontrol 是一个原子单元。它应该像 Visual Studio 中的所有其他默认服务器控件一样工作(包括设计器模式)。此外,它完全内置在代码中,并存储在 DLL 中(即它没有 html 端,也没有发布到网站)。

虽然用户控件是 ASP Include 的 .NET 版本。有一个 html 片段,其中包含相应的代码隐藏页面。有一个 ASCX 文件在发布期间被推送到网站。另外需要注意的是,这些控件比服务器控件更容易开发。

一个比另一个好吗?这取决于目标是什么。但一般来说,如果你要为其他人/项目构建一些东西来使用,请使用 webcontrol。如果您要为自己的项目使用而构建某些内容,请使用用户控件。

现在,就 JS 而言,这是一件更难描述的事情,并且需要单独进行相当大的讨论。对于服务器控件,需要为 JS 提供挂钩,以获取每个内部控件的客户端 ID。作为用户控件,您可以直接在用户控件上对 JS 进行编码,并像在 ASPX 页中一样访问控件。

评论

0赞 Mike 9/23/2008
我的控件包含 DevExpress 控件以及我添加的属性。我可以从 JavaScript 访问我的控件中的 Dx 控件(使用 Dx 控件的 ClientInstanceName)。我无法弄清楚该怎么做的是访问我的控件,然后在客户端公开我的属性。
0赞 Stephen Wrighton 9/23/2008
创建新的只读公共属性,用于公开内部控件的 ClientID。
1赞 doug 9/23/2008 #7

用户控件是随项目一起编译的,并且必须使用与项目相同的语言编写。

自定义控件可以放在画布上,并通过设置属性进行配置,而程序员不知道所有内部结构(可能是好的,也可能是坏的)。此外,由于自定义控件是在 dll 中预编译的,因此不需要使用与项目相同的语言编写它。

如果注意细节,可以编写 Custom 控件以在设计器中显示(尽管这可能不值得麻烦)。

0赞 Kris van der Mast 7/2/2010 #8

用户控件

  • 易于实现,因为您可以直观地将其他控件拖放到标记部分。
  • Visual Studio 中良好的设计器支持
  • 只能在同一项目中重复使用
  • 如果需要,还可以创建模板化用户控件(尽管不是那么常用)

自定义服务器控件

  • 更难创建,但有各种可能的场景:
    • 继承自现有控件,如 Label、Button、...
    • 创建复合控件
    • 使控件模板化 + 数据绑定
  • 在其他项目中具有出色的可重用性
  • 非常适合制作可在公司范围内使用的框架