Изменить вывод html на стороне сервера в ASP.NET
Сторонний webcontrol генерирует следующий код для отображения:
<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, или мне нужно работать с выводом в виде строки?
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);
}
Решение взято отсюда.
Наследуйте его и найдите элементы управления в дереве элементов управления и установите соответствующие атрибуты.
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
(this.Controls[6] as CheckBox).Disabled = true;
}
Очевидно, что это хрупко, если элемент управления изменит свои выходные данные в зависимости от других свойств или если вы обновите библиотеку; но если вам нужен обходной путь, это будет работать.