用于元素类型的ASP.NET全局选择器

时间:2018-02-02 10:10:16

标签: asp.net vb.net

我有几个按钮元素,当满足某个条件时,我希望将其设置为visible = false

我有一个方法可以做到这一点,我在其中定义一个列表并添加所需的按钮元素。然后我遍历列表并隐藏所有这些元素:

 Sub restrictEditAccess()
        Dim editButtons As New List(Of Control)()

        editButtons.Add(button1)
        editButtons.Add(button2)
        ...
        editButtons.Add(button9)

        For Each button In editButtons
            button.Visible = False
        Next
    End Sub

在VB中有没有办法做一个jQuery样式选择器(特别是在后端)以减少vb代码,例如:

elementsWithHTMLAttribute.Attribute("data-editAccess").visible = false

1 个答案:

答案 0 :(得分:1)

好的,这是一个解决方案,它使用了一些泛型和Func魔法。我在C#中编写了这个,然后使用http://converter.telerik.com/将其转换为VB.net。所以如果有一个语法错误,你就必须自己解决它 - 抱歉。

我有以下标记:

<asp:Button ID="button1" runat="server" Text="Button 2"/>
<asp:Button ID="button3" runat="server" Text="Button 3" data-foo="bar"/>
<asp:Button ID="button4" runat="server" Text="Button 4"/>

以下助手类:

Module Helper

    Function GetControls(Of T As WebControl)(ByVal cCol As ControlCollection, ByVal results As List(Of T), ByVal predicate As Func(Of T, Boolean)) As List(Of T)
        For Each control As Control In cCol
            If TypeOf control Is T AndAlso predicate(CType(control, T)) Then results.Add(CType(control, T))
            If control.HasControls() Then GetControls(Of T)(control.Controls, results, predicate)
        Next

        Return results
    End Function

    Function GetControls(Of T As WebControl)(ByVal cCol As ControlCollection, ByVal predicate As Func(Of T, Boolean)) As List(Of T)
        Return GetControls(cCol, New List(Of T)(), predicate)
    End Function
End Module

在您的aspx页面中,您可以使用此代码段(抱歉c#)

来调用它
Private buttons = Helper.GetControls(Of Button)(Me.Controls, Function(x) x.Attributes("data-foo") = "bar")

它做的很简单。辅助类以递归方式迭代所有嵌套的ControlCollections,从提供的父集合开始,然后遍历每个控件并检查其类型以及它是否与提供的谓词匹配。如果是这种情况,则将其添加到结果列表中。

然后,您可以使用这些控件执行任何操作。

请注意,此代码尚未生成就绪,因为它不会执行任何空检查,并且如果您不提供谓词,则很可能会中断。我将此作为练习留给你。

-------------------- C#Original ------------------------- ---

public static class Helper
{
    public static List<T> GetControls<T>(ControlCollection cCol, 
        List<T> results, 
        Func<T,bool> predicate) where T : WebControl
    {
        foreach (Control control in cCol)
        {
            if (control is T && predicate((T)control))
                results.Add((T)control);
            if (control.HasControls())
                GetControls<T>(control.Controls, results, predicate);
        }

        return results;
    }

    public static List<T> GetControls<T>(ControlCollection cCol, Func<T,bool> predicate) where T : WebControl
    {
        return GetControls(cCol, new List<T>(), predicate);
    }

}