Windows Live ID Добро пожаловать на IT Community 
Регистрация

Стань частью ИТ-сообщества

Хочешь найти своих друзей, коллег или просто интересных людей со схожими интересами в ИТ-области? Не теряй время...

Присоединяйся к нам!

Arkadi Burshtein

Denis Lisenko

Виталий Иванов


Все участники

rendering (RSS)

Просмотров: 618
Ответов: 0

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

отправлено 15 января 2007 г. 15:37 участником syntezzz@gmail.com (SynteZZZ)

Иногда в веб-приложении бывает необходимо отослать код, сгенерированный веб-контролом на 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
Читать далее...
Читать далее
Категория: ,
Просмотров: 397
Ответов: 0

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

отправлено 15 января 2007 г. 4:37 участником syntezzz@gmail.com (SynteZZZ)

Иногда в веб-приложении бывает необходимо отослать код, сгенерированный веб-контролом на 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
Читать далее...
Читать далее
Категория: ,

Блог

Календарь

«Сентябрь 2010 г.»
ПнВтСрЧтПтСбВс
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

Категории

Синдикация

Виртуальные сообщества

Сообщества сайтов (тэгами)