15 января 2007

Рендеринг веб-контрола по запросу

Иногда в веб-приложении бывает необходимо отослать код, сгенерированный веб-контролом на email пользователю. Чаще всего это встречается в системах со всяческими отчетами. Рассмотрим как это можно реализовать.

Каждый веб-контрол имеет в себе метод , RenderControl(HtmlTextWriter) который при вызове рендерит контрол и возвращает, как результат HtmlTextWriter. Программно это выглядит так:

StringBuilder SB = new StringBuilder(); StringWriter SW = new StringWriter(SB); HtmlTextWriter htmlTW = new HtmlTextWriter(SW); WebControlToRenderID.RenderControl(htmlTW);

Непосредственно к коду вы можете подобраться через метод ToString() объекта HtmlTextWriter.

Однако данный подход прекрасно работающий в ASP.NET 1.1 не подходит для ASP.NET 2.0, так как при выполнении вы получите исключение: RegisterForEventValidation can only be called during Render();

Это происходит потому, что в ASP.NET 2.0 появилась новая возможность - Event Validation. Сделана она для того, чтобы помочь избежать так называемых Injection атак.

К примеру у вас на веб-форме имеется DropDownList контрол:

<asp:DropDownList runat="server" id="MyDropDownList"> <asp:ListItem Value="1">Item 1</asp:ListItem> <asp:ListItem Value="2">Item 2</asp:ListItem> <asp:ListItem Value="3">Item 3</asp:ListItem> </asp:DropDownList>

Если через postback страница передает значение 4, то ASP.NET генерирует исключение, так как ожидает значения 1, 2 или 3. Это идеальное поведение в том случае, если вы действительно хотите получать только 1, 2 или 3, так как если пришло значение 4, это означает, что что-то пошло не так. Но, если вы, к примеру, на клиенте динамически добавляете элемент к полученому select-у, то вас такое поведение не устроит.

В цикле жизни страницы контрол регистрирует себя на подобную проверку через класс ClientScriptManager методом RegisterForEventValidation. Этот метод может быть вызван только на этапе Render, иначе он генерирует исключение. А так как скорее код для програмной генерации контрола вызывается до этого этапа, к примеру, в событии Button1_Click, то вы гарантировано получаете исключение.

Естественно, сказанное выше применимо только к контролам требующим Event Validation. Вот их список:

  1. HtmlAnchor
  2. HtmlButton
  3. HtmlInputButton
  4. HtmlInputCheckBox
  5. HtmlInputHidden
  6. HtmlInputImage
  7. HtmlInputText
  8. HtmlInputPassword
  9. HtmlInputRadioButton
  10. HtmlInputReset
  11. HtmlInputSubmit
  12. HtmlSelect
  13. HtmlTextArea
  14. BulletedList
  15. Button
  16. Calendar
  17. CheckBox
  18. Table
  19. ChildTable
  20. WizardChildTable
  21. DataControlButton
  22. ImageButton
  23. DataControlImageButton
  24. LinkButton
  25. DataControlLinkButton
  26. DataControlPagerLinkButton
  27. DataGridLinkButton
  28. DetailsView
  29. DropDownList
  30. FormView
  31. GridView
  32. HiddenField
  33. ImageMap
  34. LayoutTable
  35. ListBox
  36. Menu
  37. PagerTable
  38. RadioButton
  39. RadioButtonList
  40. TextBox
  41. TreeView
  42. WizardDefaultInnerTable
  43. CatalogZone
  44. ConnectionsZone
  45. EditorZone
  46. WebPartZone
  47. ZoneButton
  48. ZoneLinkButton
Чтобы исправить подобное поведение требуется одно легкое телодвижение. Необходимо вставить, на страницы, рендерящие контрол програмно такой параметр к директиве @Page:

<% @Page EnableEventValidation="False" ... %>

Или же вы можете начинать рендеринг контрола(ов) в событии Page_Render. Перевод статьи Emailing the Rendered Output of an ASP.NET Web Control in ASP.NET 2.0

17 комментариев:

Анонимный комментирует...

Гораздо более интересный пример - это рендеринг контрола не в обработчике на странице, а в отдельной библиотеке.

SynteZZZ комментирует...

Не вижу особой разницы если честно. Поясните пожалуйста.

Анонимный комментирует...

когда вызывается LoadControl() - это метод объекта Page.
А что будет если необходимо рендерить без объекта Page? Например из какой-то внутренней библиотеки.
Попробуй и посмотри, что выйдет

SynteZZZ комментирует...

Вот код, который будучи скомпилированный в отдельную dll - прекрасно пашет:
static public class Class1
{
static public string Rnd()
{
SqlConnection conn = new SqlConnection("Data Source=SYNTBOOK\\SQLEXPRESS;Initial Catalog=koroleva;Integrated Security=True");
SqlCommand command = new SqlCommand("SELECT * FROM pages", conn);
DataTable dt = new DataTable();
SqlDataAdapter adpter = new SqlDataAdapter(command);
adpter.Fill(dt);
DataGrid grid = new DataGrid();
grid.DataSource = dt;
grid.DataBind();
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
HtmlTextWriter wr = new HtmlTextWriter(sw);
grid.RenderControl(wr);
return sb.ToString();
}
}

Анонимный комментирует...

[url=http://wmtraffs.ru/]WMTraffs.ru[/url] - зарабатывай бабло, продавая POP-UP трафик на нашей партнёрке
Сайт WMTraffs.ru предлагает всем возможность зарабатывать на на ссылках, не имея сайта. Такженаша партнерская программа предлагает выкуп трафика с сайтов сети интернет popunder, clickunder, растяжка в шапке, обычные баннера.

Анонимный комментирует...

Да уж. Как говорится в устоявшемся выражении:
Это мы языком Пушкина и Достоевского описываем титьки Памелы Андерсон и попу Дженифер Лопес.

Анонимный комментирует...

Да уж. Как говорится в устоявшемся выражении:
Именно мы придумали набирать на сотовом номер и сбрасывать, чтобы не тратить деньги.

Анонимный комментирует...

с празником!

Анонимный комментирует...

разработка бизнеса разработка сайтов http://web-miheeff.ru разработка бизнеса

Анонимный комментирует...

порядок разработки разработка сайтов http://web-miheeff.ru порядок разработки

Анонимный комментирует...

Да уж. По поводу коментариев - навеяла на меня где-то услышанная фраза:
Ведь именно мы повернули вспять реки и счетчики электроэнергии.

Анонимный комментирует...

Вы определенно правы

Анонимный комментирует...

Добрый день!
Программа SoftHell PM-Bot (старое название HACSoft PM-Bot), необходима для массовой рассылки персональных сообщений на форумах.
Возможности:
1. Работает со многими типами форумов:SMF, ExBB, IPB1, IPB2, IPB3, IPB2 MR, miniBB, phpBB2, PunBB, vBulletin2, vBulletin 3(по 5 сообщений за раз), vBulletin3 MR(по 5 сообщений за раз)
2. Форумы описываются в специальных драйверах, т.е. при желании программу возможно настроить и на другие форумы.
3. Отсылка от нескольких пользователей одновременно (обход антифлуда).
4. Работа через прокси-сервер.
5. Система вариаций
6. Гененирование случайного числа, автоподстановка имени получателя и отправителя в каждое письмо и многое другое...


Программа обновилась до версии 2.1, не поддавайтесь на уловки мошенников со взломанной, устаревшей и не работающей версией программы.
Цена 4500 руб. Возможно проведение сделки через гаранта.
Контакты: icq 574444591
Официальный сайт: http://softhell.ru
Спасибо всем за внимание

Анонимный комментирует...

После вселенской катастрофы Америка превратилась в выжженную пустыню. По дорогам которым нет конца, кишащим бандами, с враждой поражденной войной за воду и еду, ищет престаниище безстрашный Илай. Однажды он попадает в мрачные края, где когда-то была цветущая Калифорния, а теперь это сущий ад, где бесчинствует тиран Карнеги.
смотреть бесплатно онлайн книга илая

Анонимный комментирует...

Здравствуйте!

Заметил такой вот web-сайт: Каталог номеров

Скажите, будет ли актуальна данная тема?

Анонимный комментирует...

Добрый день!

Нашел такой вот web-проект:
Настройки и программы

Прошу заценить, будет ли востребована эта тема?

Анонимный комментирует...

Очень нравятся все ваши кофейные игрушки :)
С косточкой песик стал просто неподражаем!
И лосю аксессуары в тему! На месте Санта Клауса в этот год я бы с оленями не заморачивалась;) - очень уж ваш лось к нему в упряжку просится;)))))))
А вот мой сайт возможно вас за интересует это - очередной островок любви и нежности - buy viagra ;);)...Большое спасибо вам и я очень благадарна вам за визит на мой сайт ...удачи...С Уважением