Применение серверных элементов управления
Перехват событий жизненного цикла страницы в обработчиках
-
Измените код разметки страницы 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)
