【问题标题】:When would you use a Web User Control over a Web Custom Control?您何时会在 Web 自定义控件上使用 Web 用户控件?
【发布时间】:2008-09-22 17:00:27
【问题描述】:

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

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

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

【问题讨论】:

    标签: asp.net controls client-side web-user-controls


    【解决方案1】:

    这是来自微软的网站:

    网络用户控件

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

    网页自定义控件

    • 更难创建
    • 完整的可视化设计工具支持 消费者
    • 只有一个控件副本 必需,在全球大会中 缓存
    • 可以添加到工具箱中 视觉工作室
    • 适合动态布局

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

    【讨论】:

      【解决方案2】:

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

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

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

      提示:您可以通过从标准 ASP WebControl 之一继承来避免定义自己的 WebControl 的一些麻烦。许多标准控件(如 Label 或 Image)不是密封的 - 您可以从它们继承并覆盖它们的方法以创建您自己的该控件的专用版本。这比直接扩展 WebControl 更容易且不易出错。

      【讨论】:

        【解决方案3】:

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

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

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

        这是来自微软的摘录:

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

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

            • 这个例子并不总是适用于 web 控件。例如,假设您的 web 控件生成了两个文本区域、一个标签和一个按钮,它们都包裹在一个 span 标签中?
            • 这是我遇到的问题。当我的控件包含其他控件时,如何访问它?
            【解决方案6】:

            简单:

            用户控制:

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

            网页控制:

            • WebControl 是程序集中的“唯一”类,因此您可以从它们派生另一个控件。
            • WebControl 没有 *.ascx(或其他)文件,任何人都无法更改此控件的外观(例如不合格的网络管理员)。

            【讨论】:

              【解决方案7】:

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

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

              虽然用户控件是 ASP 包含的 .NET 版本。有一个带有相应代码隐藏页面的 html sn-p。有一个 ASCX 文件在发布期间被推送到网站。附加说明,这些比服务器控件更容易开发。

              一个比另一个更好吗?这取决于目标是什么。但总的来说,如果您正在构建一些供其他人/项目使用的东西,请使用网络控件。如果您正在为自己的项目构建一些东西,那么请使用用户控件。

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

              【讨论】:

              • 我的控件中包含 DevExpress 控件以及我添加的属性。我可以从 JavaScript 访问我的控件中的 Dx 控件(使用 Dx 控件的 ClientInstanceName)。我不知道该怎么做是访问我的控件,然后在客户端公开我的属性。
              • 创建新的只读公共属性,公开内部控件的 ClientID。
              【解决方案8】:

              用户控件

              • 易于实施,因为您可以在标记部分直观地拖放其他控件。
              • Visual Studio 中良好的设计器支持
              • 只能在同一个项目中重复使用
              • 您还可以根据需要创建模板化的用户控件(虽然不常用)

              自定义服务器控件

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-10-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-03-06
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多