如何从ASP.NET代码中获取具有相同类名的html元素的数量/长度。
答案 0 :(得分:2)
IEnumerable<Control> FindRecursive( Control c, Func<Control,bool> predicate )
{
if( predicate( c ) )
yield return c;
foreach( var child in c.Controls )
{
if( predicate( c ) )
yield return c;
}
foreach( var child in c.Controls )
foreach( var match in FindRecursive( c, predicate ) )
yield return match;
}
//使用此forloop get controls
foreach( WebControl c in FindRecursive( Page, c => (c is WebControl) &&
((WebControl)c).CssClass == "test" ) )
{
//Code
}
答案 1 :(得分:2)
分析ASP.NET呈现的HTML很困难,因为这取决于客户端浏览器等因素。
但是,您可以尝试以下方法,使用control.RenderControl
呈现HTML并HtmlAgilityPack
进行分析:
protected void Page_PreRender(Object sender, EventArgs e)
{
string thisHtml = RenderControl(this.Form);
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(thisHtml);
var nodeColl = doc.DocumentNode.SelectNodes("//*[contains(@class,'fooClass')]");
Console.WriteLine("Count: " + nodeColl.Count);
// here a linq approach with the same result:
var nodes = doc.DocumentNode.Descendants()
.Where(d => d.Attributes.Contains("class") && d.Attributes["class"].Value=="fooClass");
Console.WriteLine("Count: " + nodes.Count());
}
private string RenderControl(Control control)
{
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
HtmlTextWriter writer = new HtmlTextWriter(sw);
control.RenderControl(writer);
return sb.ToString();
}
我使用了一个简单的测试页面,其中包含一些控件,其中一些控件具有类/ CssClass = fooClass
。结果似乎是正确的。
答案 2 :(得分:0)
您只能从服务器端获取标记为runat =“server”的html元素。只是一个建议:通过jquery选择器从客户端获取具有相同类的html元素,并通过ajax将它们传递给服务器。
答案 3 :(得分:0)
尝试覆盖渲染方法:
protected override void Render(HtmlTextWriter writer)
{
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
HtmlTextWriter htw = new HtmlTextWriter(sw);
base.Render(htw);
string s = sb.ToString();
//here you are able to use HTMLAgilityPack to parse HTML
writer.Write(s);
}
您将以字符串形式检索HTML并能够解析它