【问题标题】:Retrieving the number of like HTML elements from code behind in ASP.NET从 ASP.NET 中的代码中检索类似 HTML 元素的数量
【发布时间】:2013-07-03 07:24:46
【问题描述】:

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

【问题讨论】:

  • which html 文件的数量/长度?一个不同的还是你要在这个生命周期中生成的?如果是前者,请使用 HtmlAgilityPack,如果是后者,我不知道,因为无法预测 ASP.NET 将在客户端浏览器上呈现什么。
  • aspx文件关联或对应的代码隐藏文件。

标签: c# asp.net .net


【解决方案1】:
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

【讨论】:

  • OP 想要分析 html 元素而不是服务器控件(或至少不仅如此)。
【解决方案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。结果似乎是正确的。

【讨论】:

    【解决方案3】:

    尝试重写 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 作为字符串 s 并能够解析它

    【讨论】:

      【解决方案4】:

      您只能从服务器端获取标记为 runat="server" 的 html 元素。只是一个建议:通过 jquery 选择器从客户端获取具有相同类的 html 元素,并通过 ajax 将它们传递给服务器。

      【讨论】:

        猜你喜欢
        • 2013-07-28
        • 2012-09-19
        • 1970-01-01
        • 1970-01-01
        • 2020-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多