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

Управление состоянием ASP.NET

Упражнение 7

Проиллюстрируем межстраничную отсылку на примере двух страниц-источников и двух страниц-приемников.

  • Добавьте к проекту страницу с совмещенным кодом и именем SourcePostBack1.aspx
  • Назначьте страницу стартовой и оформите пользовательский интерфейс на этапе проектирования так, как показано на рисунке

Здесь использованы серверные элементы Label, TextBox, ListBox, Button и HyperLink.

  • Для элемента управления ListBox включите свойство AutoPostBack
  • Заполните страницу следующим кодом
    <%@ Page Language="C#" %>
        
    <script runat="server">
        
        // Функция доступа к закрытому полю класса из внешнего кода
        public string GetName()
        {
            return txtName.Text;
        }
        
        // Свойство доступа к закрытым данным класса из внешнего кода
        public string GetTitle
        {
            get { return lblTitle.Text; }
        }
        
        string text;
        
        protected void Page_Load(object sender, EventArgs e)
        {
            // Просто отображаем страницу
            if (lstPost.SelectedItem == null)
                return;
            
            // Выбираем целевую страницу при AutoPostBack списка
            text = lstPost.SelectedItem.Text;
            if (String.Compare(text, "Студент", true) == 0)
                btnPostBackUrl.PostBackUrl = "~/CrossPageStudent.aspx";
            else 
                btnPostBackUrl.PostBackUrl = "~/CrossPageLecturer.aspx";
        }
        
        protected void btn_Click(object sender, EventArgs e)
        {
            // Контролируем наличие выбора при щелчках на кнопках
            if (lstPost.SelectedItem == null)
            {
                String mess = "<script>alert('Выберите сотрудника')</" + "script>";
                this.Response.Write(mess);
                return;
            }
        
            text = lstPost.SelectedItem.Text;
            
            // Различаем кнопки
            Button btn = (Button)sender;
            if (String.Compare(btn.Text, "PostBackUrl", true) != 0)
            {
                if (String.Compare(text, "Студент", true) == 0)
                    this.Server.Transfer("~/CrossPageStudent.aspx", true);
                else
                    this.Server.Transfer("~/CrossPageLecturer.aspx", true);
            }
        }
    </script>
        
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Untitled Page</title>
    </head>
    <body>
        <form id="form1" runat="server">
            <div style="text-align: center">
                <asp:Label ID="lblTitle" runat="server" Text="Это первая страница-источник"></asp:Label>
                <br />
                <br />
                Фамилия:&nbsp;
                <asp:TextBox ID="txtName" runat="server">Иванов</asp:TextBox>&nbsp;
                <asp:ListBox ID="lstPost" runat="server" Height="45px" AutoPostBack="True">
                    <asp:ListItem>Студент</asp:ListItem>
                    <asp:ListItem>Доцент</asp:ListItem>
                </asp:ListBox>
                <br />
                <br />
                <asp:Button ID="btnPostBackUrl" runat="server" Text="PostBackUrl" OnClick="btn_Click" />&nbsp;
                <asp:Button ID="btnServerTransfer" runat="server" OnClick="btn_Click"
                    Text="Server.Transfer()" />
                <br />
                <br />
                <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="SourcePostBack2.aspx">
                На вторую страницу-источник</asp:HyperLink>
            </div>
        </form>
    </body>
    </html>
  • Получите копию страницы SourcePostBack1.aspx под именем SourcePostBack2.aspx и скорректируйте в ней элементы lblTitle и HyperLink1
  • Создайте новую страницу с именем CrossPageStudent.aspx без файла отделенного кода, в которой блок скриптов заполните так
    <%@ Page Language="C#" %>
        
    <script runat="server">
        
        // Поля, заполняемые данными вызвавшей страницы
        String name, title, className;
        
        // Наша функция, использующая доступ с помощью механизма отражения типов
        void GetInfoPreviousPage()
        {
            // Получаем тип запускающей страницы для
            // динамического вызова членов представляющего класса
            System.Type typePreviousPage = this.PreviousPage.GetType();
            // Находим общедоступный метод класса 
            System.Reflection.MethodInfo methodGetName =
                typePreviousPage.GetMethod("GetName");
            // Выполняем метод предыдущей страницы
            name = methodGetName.Invoke(this.PreviousPage, null).ToString();
            // Находим общедоступное свойство класса 
            System.Reflection.PropertyInfo propertyGetTitle =
                typePreviousPage.GetProperty("GetTitle");
            // Выполняем свойство предыдущей страницы
            title = propertyGetTitle.GetGetMethod().
                Invoke(this.PreviousPage, null).ToString();
            // Извлекаем имя класса предыдущей страницы
            className = this.PreviousPage.GetType().Name;
        }
        
        protected void Page_Load(object sender, EventArgs e)
        {
            // Получаем информацию с предыдущей страницы
            GetInfoPreviousPage();
        
            Label label = new Label();
            form1.Controls.Add(label);
            string text = "<h1 style='text-align: center; color: Red'>";
        
            if (this.PreviousPage == null)
            {
                text += "Страница запущена напрямую</h1>";
                label.Text = text;
                return;
            }
        
            text += "Методом межстраничной обратной отсылки получены данные</h1>";
            text += "<ul>";
            text += "<li>Заголовок: " + title + "</li>";
            
            if (String.Compare(className, "SourcePostBack1_aspx", true) == 0)
                text += "<li>Данные прислала первая страница</li>";
            else if (String.Compare(className, "SourcePostBack2_aspx", true) == 0)
                text += "<li>Данные прислала вторая страница</li>";
            text += "<li>Фамилия студента: " + name + "</li>";
            
            if (this.PreviousPage.IsCrossPagePostBack)
                text += "<li>Обратная отсылка инициирована свойством PostBackUrl</li>";
            else
                text += "<li>Обратная отсылка инициирована методом Server.Transfer()</li>";
            text += "</ul>";
            label.Text = text;
        }
    </script>
        
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Untitled Page</title>
    </head>
    <body>
        <form id="form1" runat="server">
        </form>
    </body>
    </html>
  • Получите копию страницы CrossPageStudent.aspx под именем CrossPageLecturer.aspx

Эти обе страницы-приемники имеют совершенно одинаковый код и просто демонстрируют работу схемы межстраничной передачи данных "многие ко многим". В обеих страницах используется наша функция GetInfoPreviousPage(), в которую мы упаковали код, извлекающий данные из класса страницы-источника на этапе выполнения. Этот прием применен потому, что при прямой адресации к членам предыдущей страницы компилятор ищет их в текущей странице и выдает ошибку компиляции (и правильно делает). А при динамическом доступе он работает только со строковыми именами свойств и методов предыдущей страницы.

  • Разберитесь с кодом отсылающей и принимающей сторон и испытайте их работу

Вариант результата на принимающей странице будет примерно таким