0

如何从后面的 ASP.NET 代码中获取具有相同类名的 html 元素的数量/长度。

4

4 回答 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
}

Reference

于 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 回答