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

时间:2010-01-19 15:00:41

标签: asp.net .net

我发现自己需要在HtmlControls和WebControls上执行相同的操作。我坚信DRY并且发现如果我想在两种类型上合并函数,那么只有Control类才能使用。我使用Control时遇到的问题是HtmlControl和WebControl都暴露了Control不具备的某些属性。在当前情况下,Attributes属性是问题。有没有人对如何避免此类实例中的代码重复有任何建议?

4 个答案:

答案 0 :(得分:3)

HtmlControl和WebControl都实现了接口IAttributeAccessor(显式)。请改用IAttributeAccessor.SetAttribute。我不是vb.net编码器,所以我将编写代码的任务留给读者。 ;)

答案 1 :(得分:2)

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

  • 使用反射分配其中一些常用设置。
  • 创建一个包装类,可以使用webcontrol或html控件引用,并分配值。 (如果控件是webcontrol)如果(html是htmlcontrol)赋值,则赋值,就像那样。
  • 创建另一个逻辑类来存储常用设置,然后创建另一个组件来复制这些设置并将它们应用到类中。

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

答案 2 :(得分:2)

过去我复制了代码来设置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        

答案 3 :(得分:0)

西蒙的回答有效:

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