Россия |
Управление состоянием 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 /> Фамилия: <asp:TextBox ID="txtName" runat="server">Иванов</asp:TextBox> <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" /> <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(), в которую мы упаковали код, извлекающий данные из класса страницы-источника на этапе выполнения. Этот прием применен потому, что при прямой адресации к членам предыдущей страницы компилятор ищет их в текущей странице и выдает ошибку компиляции (и правильно делает). А при динамическом доступе он работает только со строковыми именами свойств и методов предыдущей страницы.
-
Разберитесь с кодом отсылающей и принимающей сторон и испытайте их работу
Вариант результата на принимающей странице будет примерно таким