Изменить вывод html на стороне сервера в ASP.NET

Сторонний веб-элемент управления генерирует следующий код для отображения самого себя:

<div id="uwg">
    <input type="checkbox" />
    <div>blah-blah-blah</div>
    <input type="checkbox" />
</div>

Можно ли изменить его на

<div id="uwg">
    <input type="checkbox" disabled checked />
    <div>blah-blah-blah</div>
    <input type="checkbox" disabled checked />
</div>

Когда мы нажимаем на

<asp:CheckBox id="chk_CheckAll" runat="server" AutoPostBack="true" />

находится на той же странице?

Нам нужно сделать это на стороне сервера (в ASP.NET).

Тот сторонний контрол не дает интерфейса для этого, поэтому единственная возможность - работать с выводом html. Какое событие страницы я должен обрабатывать (если есть)? Кроме того, есть ли эквивалент модели DOM или мне нужно работать с выводом в виде строки?


person Roma    schedule 19.05.2009    source источник


Ответы (2)


Когда флажки не запускаются на сервере или инкапсулированы внутри элемента управления, мы можем использовать следующий метод:

protected override void Render(HtmlTextWriter writer)
{
    // setup a TextWriter to capture the markup
    TextWriter tw = new StringWriter();
    HtmlTextWriter htw = new HtmlTextWriter(tw);

    // render the markup into our surrogate TextWriter
    base.Render(htw);

    // get the captured markup as a string
    string pageSource = tw.ToString();

    string enabledUnchecked = "<input type=\"checkbox\" />";
    string disabledChecked = "<input type=\"checkbox\" disabled checked />";

    // TODO: need replacing ONLY inside a div with id="uwg"
    string updatedPageSource = pageSource;
    if (chk_CheckAll.Checked)
    {
         updatedPageSource = Regex.Replace(pageSource, enabledUnchecked,
                disabledChecked, RegexOptions.IgnoreCase);
    }

    // render the markup into the output stream verbatim
    writer.Write(updatedPageSource);
}

Решение взято из здесь.

person Roma    schedule 19.05.2009
comment
Это метод либо для моей страницы, либо для веб-контроля, унаследованный от этого стороннего элемента управления. - person Roma; 20.05.2009
comment
Это решение очень хорошо работает в моем пользовательском элементе управления, поскольку оно только переписывает вывод для отдельного элемента управления, в котором вы находитесь. функция и заменяет часть HTML в ней другим HTML. - person Jrud; 09.11.2011

Унаследуйте его и найдите элементы управления в дереве элементов управления и установите соответствующие атрибуты.

 protected override void OnPreRender(EventArgs e)
 {
      base.OnPreRender(e);
      (this.Controls[6] as CheckBox).Disabled = true;
 }

Очевидно, что это хрупко, если элемент управления изменит свой вывод в зависимости от других свойств или если вы обновите библиотеку; но если вам нужен обходной путь, это сработает.

person Tom Ritter    schedule 19.05.2009
comment
Здорово! И, я думаю, я могу получить первый div по его id (у него есть id, хотя я его не показывал), и найти его дочерние элементы по типу, как показано выше? - person Roma; 19.05.2009
comment
Да, вы можете использовать FindControl(id) - person Tom Ritter; 19.05.2009
comment
Спасибо. И могу ли я просто реализовать Page.OnPreRender(EventArgs e) для моей текущей страницы без наследования? - person Roma; 19.05.2009
comment
Вы могли бы, но это повлияет только на элемент управления на этой странице, а не на другие места, где вы хотите его использовать. - person Tom Ritter; 19.05.2009
comment
Протестировано. Не работает, потому что галочки не запускаются на сервере. (Они не существуют в коллекции дочерних элементов управления.) - person Roma; 19.05.2009