Опубликован: 07.05.2010 | Доступ: свободный | Студентов: 1678 / 62 | Оценка: 4.56 / 4.06 | Длительность: 34:11:00
Лекция 5:

Применение серверных элементов управления

< Лекция 4 || Лекция 5: 12 || Лекция 6 >

Перехват событий жизненного цикла страницы в обработчиках

  • Измените код разметки страницы 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>";// Поезд ушел, выводим в никуда
        }
    }

В каждый обработчик событий жизненного цикла страницы мы включили текстовый вывод в три места:

  1. В окно Output оболочки в режиме отладки (вызывается командой меню View/Output
  2. В генерируемый отклик страницы впереди разметочной части
  3. В разметочную часть страницы динамически добавляем информацию

В окне 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)
< Лекция 4 || Лекция 5: 12 || Лекция 6 >