<div id="foo" runat="server" data-id="bar"></div>
在后面的代码中,这个 div 可以直接在 id 上访问,也可以使用FindControl()
.
但是有什么方法可以根据除 id 之外的另一个属性来搜索 aspx 上的元素吗?就像data-id="bar"
上面的例子。
这种扩展方法(使用递归)可能会有所帮助:
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;
}
}
}
}
您需要查看您在 FindControl 中迭代的控件的属性是什么,或者您是否像这样直接访问元素:
this.foo
那么你可以使用 Attributes 集合来查看指定的属性值是什么。 http://msdn.microsoft.com/en-us/library/kkeesb2c(v=vs.100).aspx
但是要回答您的问题-不,除非您使用 FindControl() 迭代容器/父控件,否则没有