<div id="foo" runat="server" data-id="bar"></div>
在后面的代码中,可以直接在id上或使用FindControl()
访问此div。
但有没有办法根据另一个属性而不是id在aspx上搜索元素?例如上面的data-id="bar"
。
答案 0 :(得分:4)
此扩展方法(使用递归)可能会有所帮助:
public static IEnumerable<Control>
FindControlByAttribute(this Control control, string key)
{
var current = control as System.Web.UI.HtmlControls.HtmlControl;
if (current != null)
{
var k = current.Attributes[key];
if (k != null)
yield return current;
}
if (control.HasControls())
{
foreach (Control c in control.Controls)
{
foreach (Control item in c.FindControlByAttribute(key, value))
{
yield return item;
}
}
}
}
样本用法:
protected void Page_Load(object sender, EventArgs e)
{
var controls = this
.FindControlByAttribute("data-id")
.ToList();
}
如果您还想按值过滤:
public static IEnumerable<Control>
FindControlByAttribute(this Control control, string key, string value)
{
var current = control as System.Web.UI.HtmlControls.HtmlControl;
if (current != null)
{
var k = current.Attributes[key];
if (k != null && k == value)
yield return current;
}
if (control.HasControls())
{
foreach (Control c in control.Controls)
{
foreach (Control item in c.FindControlByAttribute(key, value))
{
yield return item;
}
}
}
}
答案 1 :(得分:0)
您需要查看在FindControl中迭代的控件的属性,或者您是否直接访问该元素:
this.foo
然后您可以使用Attributes集合来查看指定的属性值。 http://msdn.microsoft.com/en-us/library/kkeesb2c(v=vs.100).aspx
但要回答你的问题 - 不,除非你使用FindControl()迭代容器/父控件,否则没有