Применение серверных элементов управления
Перехват событий жизненного цикла страницы в обработчиках
-
Измените код разметки страницы Default.aspx, чтобы он выглядел так
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div id="div1" runat="server"> <h1 align="center" style="color: Red"> Диагностика событий страницы</h1> </div> </form> </body> </html>
-
Откройте файл отделенного кода Default.aspx.cs и заполните его так
using System; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { System.Diagnostics.Debug.WriteLine( "************Page_Load*********"); Response.Write("Page_Load<br>\n"); div1.InnerHtml += "Page_Load<br>\n"; } protected void Page_PreLoad(object sender, EventArgs e) { System.Diagnostics.Debug.WriteLine( "************Page_PreLoad*********"); Response.Write("Page_PreLoad<br>\n"); div1.InnerHtml += "Page_PreLoad<br>\n"; } protected void Page_PreInit(object sender, EventArgs e) { System.Diagnostics.Debug.WriteLine( "************Page_PreInit*********"); Response.Output.WriteLine("Page_PreInit<br>"); div1.InnerHtml += "Page_PreInit<br>\n"; } protected void Page_Init(object sender, EventArgs e) { System.Diagnostics.Debug.WriteLine( "************Page_Init*********"); Response.Output.WriteLine("Page_Init<br>"); div1.InnerHtml += "Page_Init<br>\n"; } protected void Page_PreRender(object sender, EventArgs e) { System.Diagnostics.Debug.WriteLine( "************Page_PreRender*********"); Response.Output.WriteLine("Page_PreRender<br>"); div1.InnerHtml += "Page_PreRender<br>\n"; } protected void Page_Render(object sender, EventArgs e) { System.Diagnostics.Debug.WriteLine( "************Page_Render*********"); Response.Output.WriteLine("Page_Render<br>"); div1.InnerHtml += "Page_Render<br>\n"; } protected void Page_UnLoad(object sender, EventArgs e) { System.Diagnostics.Debug.WriteLine( "************Page_UnLoad*********"); //Response.Output.WriteLine("Page_UnLoad<br>");// Поздно, уже все разрушено! div1.InnerHtml += "Page_UnLoad<br>";// Поезд ушел, выводим в никуда } }
В каждый обработчик событий жизненного цикла страницы мы включили текстовый вывод в три места:
- В окно Output оболочки в режиме отладки (вызывается командой меню View/Output
- В генерируемый отклик страницы впереди разметочной части
- В разметочную часть страницы динамически добавляем информацию
-
Запустите страницу под управлением оболочки - сгенерируется следующий рендеринг
В окне Output оболочки последние строки будут такими
************Page_PreInit********* ************Page_Init********* ************Page_PreLoad********* ************Page_Load********* ************Page_PreRender********* ************Page_UnLoad*********
Интересно заметить, что код отладки из готовой страницы убирать не нужно. Он автоматически не включается в компиляцию, если из конфигурационного файла убрать параметр <compilation debug="true"/> или выполнить страницу без отладки.
Страницу без отладки можно запустить напрямую, вызвав броузер через контекстное меню разметочной части страницы командой View in Browser, или выполнив команду оболочки Debug/Start Without Debugging (выполнить без включения отладки). В любом случае среда исполнения ASP.NET перекомпилирует страницу (если были последние изменения в исходном коде по сравнению с DLL) и выполнит ее, направив сгенерированный HTML-код броузеру.
Динамическое добавление элементов управления
Приведем пример программного добавления элементов управления на страницу.
-
Командой меню File/New/Web Site создайте новый Web-проект типа ASP.NET Web Site
-
Откройте файл Default.aspx.cs и заполните его следующим кодом
using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class _Default : System.Web.UI.Page { // Поля для видимости в методах Label lbl1, lbl2; TextBox textBox; Button btn; // Свойство для генерации тега <br></br> protected HtmlGenericControl BR { get { return new HtmlGenericControl("br"); } } protected void Page_Load(object sender, EventArgs e) { lbl1 = new Label(); lbl2 = new Label(); textBox = new TextBox(); // Подписка на событие с регистрацией обработчика textBox.TextChanged += new EventHandler(textBox_TextChanged); btn = new Button(); form1.Controls.Add(lbl1); form1.Controls.Add(BR); form1.Controls.Add(lbl2); form1.Controls.Add(BR); form1.Controls.Add(textBox); form1.Controls.Add(BR); form1.Controls.Add(btn); textBox.Focus(); if (!this.IsPostBack) { // Настройки при первом запросе, // далее сохраняемые в ViewState lbl1.Text = "Label"; lbl1.ToolTip = "Это текстовая метка1"; lbl2.Text = "Labe2"; lbl2.ToolTip = "Это текстовая метка2"; textBox.Style.Value = "color: red; font-style: italic"; textBox.ToolTip = "Это текстовое поле"; btn.Text = "Кнопка"; btn.ToolTip = "Это кнопка Submit"; } } void textBox_TextChanged(object sender, EventArgs e) { string str = "<b>" + textBox.Text + "</b>"; lbl1.Text = str;// Интерпретируемый вывод lbl2.Text = HttpUtility.HtmlEncode(str);// Неинтерпретируемый вывод } }
Для приема данных из ненадежных источников все дескрипторы нужно превратить в обычные текстовые символы. Для этого применяются два одинаковых метода
- System.Web.HttpUtility.HtmlEncode(string)
- System.Web.UI.Page.Server.HtmlEncode(string)