2013-07-05 2 views
0

Как можно получить число/длину элементов html с теми же именами классов из кода ASP.NET позади.Извлечение числа подобных HTML-элементов из кода в ASP.NET

+0

Количество/длина файла _which_html? Другой или тот, который вы собираетесь генерировать на этом жизненном цикле? Если первое, используйте HtmlAgilityPack, если последнее, я понятия не имею, поскольку не предсказуемо, что ASP.NET будет отображать в браузере клиента. –

+0

Файл aspx, связанный или соответствующий файлу кода. – Sam

ответ

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

+0

OP хочет проанализировать элементы html, а не серверные элементы управления (или, по крайней мере, не только). –

0

Вы можете получить только HTML элементы, помеченные как RUNAT = "сервер" со стороны сервера. Просто предложение: получите элементы html, которые имеют один и тот же класс с клиентской стороны с помощью селекторов jquery и передают их на сервер через ajax.

+0

Неверный, вы можете найти элементы с FindControl –

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 как строка s и будет в состоянии разобрать его

2

Это трудно анализировать HTML, который визуализируется с помощью ASP.NET, так что зависит от таких факторов, как браузер клиента.

Однако, вы можете попробовать следующий подход, который использует 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. Результат оказался правильным.

Смежные вопросы