代码之家  ›  专栏  ›  技术社区  ›  David Williams

如何在WebControls和HTMLControls上执行相同的操作

  •  3
  • David Williams  · 技术社区  · 15 年前

    我发现自己需要对HTMLControls和WebControls执行相同的操作。我坚信Dry,并且发现如果我想合并这两种类型的函数,只有控制类可以使用。我在使用控件时遇到的问题是,HTMLControl和WebControl都公开了某些属性,而该控件没有公开这些属性。在当前情况下,属性属性是问题所在。对于如何避免这种类型的实例中的代码重复,有人有什么建议吗?

    4 回复  |  直到 12 年前
        1
  •  2
  •   Steve Wortham    15 年前

    在过去,我复制了用于设置HTMLControls和WebControls属性的代码。不过,还有一个想法:

    Private Sub SetAttribute(ByRef ctrl As Control, ByVal key As String, ByVal value As String)
        If TypeOf ctrl Is HtmlControl Then
            DirectCast(ctrl, HtmlControl).Attributes(key) = value 
        ElseIf TypeOf ctrl Is WebControl Then
            DirectCast(ctrl, WebControl).Attributes(key) = value 
        End If
    End Sub
    
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        For Each ctrl In Me.Controls
            SetAttribute(ctrl, "class", "classname")
        Next
    End Sub        
    
        2
  •  3
  •   sisve    13 年前

    htmlcontrol和webcontrol都实现了接口 IAttributeAccessor (明确)。使用 IAttributeAccessor.SetAttribute 相反。我不是一个vb.net程序员,所以我把编写代码的任务留给了读者。;)

        3
  •  2
  •   Brian Mains    15 年前

    我知道你的意思。理论上,您可以执行以下操作之一:

    • 使用反射指定一些常用设置。
    • 创建一个包装类,它可以接受WebControl或HTML控件引用,并分配值。(如果控件是webcontrol)赋值;如果(html是html control)赋值,类似这样。
    • 创建另一个逻辑类来存储公共设置,然后创建另一个组件来复制这些设置并将它们应用到类中。

    最终,没有任何公共桥(没有公共的基类或接口)。我们在讨论什么样的作业?

        4
  •  0
  •   TKTS    12 年前

    西蒙的回答很有效:

    Private Sub SetAttribute(ByRef ctrl As IAttributeAccessor, ByVal key As String, ByVal value As String)
        ctrl.SetAttribute(key, value)
    End Sub
    
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        For Each ctrl In Me.Controls.OfType(Of IAttributeAccessor)()
                SetAttribute(ctrl, "class", "classname")
        Next
    End Sub
    
    推荐文章