从ASP.NET中的代码中检索类似HTML元素的数量

时间:2013-07-05 08:42:51

标签: c# asp.net .net

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

4 个答案:

答案 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
}

Reference

答案 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并能够解析它