2014-12-02 66 views
0

我在想如果我能夠通過自定義屬性名稱訪問aspx中的元素。像通過自定義屬性訪問元素

HtmlElement[] allElements = Page.FindElementByCustomName("custom-name"); 

,它會給我與屬性的所有元素的數組假設我的aspx是如下

<a runat="server" custom-name = "any">Faf</a> 
<a runat="server">AB</a> 
<a runat="server" custom-name = "any">Amla</a> 

allElements將有兩個a元素,即

<a runat="server" custom-name = "any">Faf</a> 
<a runat="server" custom-name = "any">Amla</a> 

是有可能嗎?

+1

向下投票不是壞事,但投票沒有評論聽起來像你被你的妻子毆打,並取消了對我的挫折:P – Imad 2014-12-02 10:20:53

回答

2

您可以迭代頁面中的所有控件,但它必須遞歸執行。例如,從Page.Controls開始,然後,對於每個控件,遍歷其Controls集合。對於需要實現IAttributeAccessor的屬性的控件,你可以檢查迭代中的控件是否實現了這個接口。它是在標記中插入自定義屬性時所需的接口。例如,WebControl實現它。如果現在,當您嘗試添加自定義屬性時,ASP.NET將失敗,說沒有該名稱的屬性。 喜歡的東西:

public static void ListControls(ControlCollection controls, List<Control> controlsFound) 
{ 
    foreach (var control in controls.OfType<Control>()) 
    { 
     if (control is IAttributeAccessor) 
     { 
      controlsFound.Add(control); 
      ListControls(control.Controls, controlsFound); 
     } 
    } 
} 

,你應該從你的頁面中調用:

var controlsFound = new List<Control>(); 
ListControls(this.Controls, controlsFound); 

最終,剛剛經歷controlsFound,你知道迭代是IAttributeAccessor的收集和檢索屬性的屬性名稱:

var attr = (control as IAttributeAccessor).GetAttribute("attribute-name"); 
+0

被發現的控件和控件相同? – Imad 2014-12-02 10:54:05

+1

是的,對不起!更正了,謝謝。讓我知道你是否需要任何澄清。 – 2014-12-02 10:57:45

+0

請問他們是什麼?現在試試。 – 2014-12-02 11:03:54