什么情况下会使用Web用户控件而不是Web自定义控件?

8

有人能解释一下什么时候使用它们吗?在许多情况下,它们似乎可以互换使用。

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

此外,我正在寻找最佳方法来从JavaScript访问控件(GetElementById)。因此,指向正确方向以添加客户端支持的指针将非常有帮助。

8个回答

10
这是来自微软网站的内容:

Web用户控件

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

Web自定义控件

  • 更难创建
  • 为消费者提供全面的视觉设计工具支持
  • 只需要一个控件副本存储在全局程序集缓存中
  • 可以添加到Visual Studio的工具箱中
  • 适用于动态布局

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


3
一个UserControl必须由网站托管,并使用codebehind模型与ASCX文件相关联。因此,使用用户控件,您可以在ASCX文件中定义控件的基本标记,并将所有代码放入ASCX.CS文件中。
WebControl只是一个类,不允许您定义关联的ASCX文件;您需要覆盖Render函数以打印出控件将生成的任何标记。但是,因为它不依赖于ASCX,所以可以将其放入共享库中。(DLL)
回答您的问题:Web和UserControls都具有相同的好处-它们占用页面的一部分并封装它。我在代码仅适用于我的一个站点时使用UserControls;如果我在多个站点中使用类似的代码,则会将代码转换为WebControl并将其移动到共享库中。这样,当我需要更新时,我只需在一个地方进行更改,而不是3或4个地方。
提示:您可以通过继承一个标准ASP WebControl来避免定义自己的WebControl的某些麻烦。许多标准控件(如Label或Image)未封装-您可以从它们继承并覆盖其方法以创建自己的专业版本的该控件。这比直接扩展WebControl更容易且更少出错。

1

我认为你所想的是自定义控件和用户控件,它们都是Web控件。用户控件没有设计师UI,而自定义控件可以有。

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

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

以下是Microsoft的摘录:

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


1
用户控件与项目一起编译,必须使用与项目相同的语言编写。
自定义控件可以在画布上放置,并通过设置属性进行配置,而程序员不需要了解所有内部细节(这可能有利也可能有弊)。另外,由于自定义控件在dll中预编译,因此它不需要使用与项目相同的语言编写。
如果仔细注意细节,自定义控件可以编写成在设计器中显示(尽管这可能不值得麻烦)。

0

用户控件

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

自定义服务器控件

  • 创建难度较大,但有各种可能的场景:
    • 继承现有控件,如Label、Button等
    • 创建一个组合控件
    • 制作模板化、+数据绑定的控件
  • 在其他项目中具有很好的可重用性
  • 非常适合制作可在整个公司范围内使用的框架

0

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


这个例子并不总适用于Web控件。例如,假设您的Web控件产生了两个文本区域、一个标签和一个按钮,都被包含在一个<span>标记中? - Stephen Wrighton
这是我遇到的问题。当控件包含其他控件时,如何访问我的控件? - Mike

0

简单:

UserControl用户控件:

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

WebControl网页控件:

  • WebControl只是程序集中的类,因此您可以从它们派生出另一个控件。
  • WebControl没有*.ascx(或其他)文件,因此没有人可以更改此控件的外观(例如不合格的Web管理员)。

0

那并不完全正确。WebControl就像一个按钮,你可以为它构建一个设计器,以便在设计模式下呈现。

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

而用户控件是ASP Include的.NET版本。它有一个对应的代码后台页面和HTML片段。在发布期间,会将一个ASCX文件推送到网站上。另外需要注意的是,这些比服务器控件更容易开发。

哪个更好?这取决于目标是什么。但一般来说,如果您正在构建供其他人/项目使用的东西,请选择WebControl。如果您正在构建供自己项目使用的东西,请选择用户控件。

现在就 JavaScript 而言,这是一件比较难描述的事情,需要进行一次相当大的讨论。对于服务器控件而言,你需要提供钩子以使 JS 能够获取每个内部控件的客户端 ID。而对于用户控件,你可以直接在用户控件上编写 JS,并且以与 ASPX 页面中相同的方式访问控件。

我的控件中包含DevExpress控件以及我添加的属性。我可以通过JavaScript(使用Dx控件的ClientInstanceName)访问我的控件中的Dx控件。但我无法弄清楚如何访问我的控件并在客户端公开我的属性。 - Mike
创建新的只读公共属性,以公开内部控件的ClientID。 - Stephen Wrighton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接