如何从后面的 ASP.NET 代码中获取具有相同类名的 html 元素的数量/长度。
问问题
771 次
4 回答
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获取控件
foreach( WebControl c in FindRecursive( Page, c => (c is WebControl) &&
((WebControl)c).CssClass == "test" ) )
{
//Code
}
于 2013-07-05T08:49:21.173 回答
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();
}
我使用了一个简单的测试页面,其中包含一些控件,其中一些控件具有 class/CssClass = fooClass
。结果似乎是正确的。
于 2013-07-05T09:00:13.520 回答
0
您只能从服务器端获取标记为 runat="server" 的 html 元素。只是一个建议:通过 jquery 选择器从客户端获取具有相同类的 html 元素,并通过 ajax 将它们传递给服务器。
于 2013-07-05T08:55:09.987 回答
0
尝试覆盖 Render 方法:
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 作为 string s 并将能够解析它
于 2013-07-05T08:58:26.683 回答