Взаимодействие со страницей содержимого на эталонной странице (VB)Interacting with the Content Page from the Master Page (VB)

по Скотт Митчеллby Scott Mitchell

Скачать код или скачать PDFDownload Code or Download PDF

Рассматривается вызов методов, установка свойств и т. д. страницы содержимого из кода на главной странице.Examines how to call methods, set properties, etc. of the Content Page from code in the Master Page.

ВведениеIntroduction

В предыдущем учебнике было рассмотрено, как программно взаимодействовать со страницей содержимого.The preceding tutorial examined how to have the content page programmatically interact with its master page. Вспомним, что мы обновили главную страницу, включив в нее элемент управления GridView, в котором перечислены пять последних добавленных продуктов.Recall that we updated the master page to include a GridView control that listed the five most recently added products. Затем мы создали страницу содержимого, из которой пользователь может добавить новый продукт.We then created a content page from which the user could add a new product. После добавления нового продукта на странице содержимого необходимо указать, что главной страницей необходимо обновить GridView, чтобы она включала только что добавленный продукт.Upon adding a new product, the content page needed to instruct the master page to refresh its GridView so that it would include the just-added product. Эта функция была реализована путем добавления открытого метода к главной странице, которая обновила данные, привязанные к GridView, и затем вызывает этот метод на странице содержимого.This functionality was accomplished by adding a public method to the master page that refreshed the data bound to the GridView, and then invoking that method from the content page.

Наиболее распространенная форма взаимодействия содержимого и главной страницы происходит на странице содержимого.The most common form of content and master page interaction originates from the content page. Тем не менее, главной страницей может быть Раусе текущей страницы содержимого в действие, и такие функции могут потребоваться, если на главной странице содержатся элементы пользовательского интерфейса, позволяющие пользователям изменять данные, которые также отображаются на странице содержимого.However, it is possible for the master page to rouse the current content page into action, and such functionality may be needed if the master page contains user interface elements that enable users to modify data that is also displayed on the content page. Рассмотрим страницу содержимого, в которой отображаются сведения о продуктах в элементе управления GridView и главной странице, содержащей элемент управления Button, который при нажатии удваивает цены всех продуктов.Consider a content page that displays the products information in a GridView control and a master page that includes a Button control that, when clicked, doubles the prices of all products. Подобно примеру в предыдущем руководстве, GridView необходимо обновить после нажатия кнопки двойной цены, чтобы отобразить новые цены, но в этом сценарии это Главная страница, которая должна Раусе страницу содержимого в действие.Much like the example in the preceding tutorial, the GridView needs to be refreshed after the double price Button is clicked so that it displays the new prices, but in this scenario it's the master page that needs to rouse the content page into action.

В этом учебнике рассматриваются способы вызова функций главной страницы, определенных на странице содержимого.This tutorial explores how to have the master page invoke functionality defined in the content page.

Инстигатинг программное взаимодействие с помощью событий и обработчиков событийInstigating Programmatic Interaction via an Event and Event Handlers

Вызов функций страницы содержимого из главной страницы является более сложной задачей, чем другой способ.Invoking content page functionality from a master page is more challenging than the other way around. Поскольку страница содержимого имеет одну главную страницу, то при инстигатинг программного взаимодействия со страницы содержимого мы понимаем, какие открытые методы и свойства в нашем распоряжении.Because a content page has a single master page, when instigating the programmatic interaction from the content page we know what public methods and properties are at our disposal. Однако Главная страница может иметь много разных страниц содержимого, каждый из которых имеет собственный набор свойств и методов.A master page, however, can have many different content pages, each with its own set of properties and methods. Как же можно написать код на главной странице, чтобы выполнить какое-либо действие на странице содержимого, если неизвестно, какая страница содержимого будет вызываться до выполнения?How, then, can we write code in the master page to perform some action in its content page when we don't know what content page will be invoked until runtime?

Рассмотрим веб-элемент управления ASP.NET, например элемент управления Button.Consider an ASP.NET Web control, such as the Button control. Элемент управления "Кнопка" может отображаться на любом количестве страниц ASP.NET и иметь механизм, с помощью которого она может оповещать страницу, на которую был выполнен щелчок.A Button control can appear on any number of ASP.NET pages and needs a mechanism by which it can alert the page that it has been clicked. Это выполняется с помощью событий.This is accomplished using events. В частности, элемент управления "Кнопка" вызывает событие Click при щелчке; страница ASP.NET, содержащая кнопку, может также отвечать на это уведомление через обработчик событий.In particular, the Button control raises its Click event when it is clicked; the ASP.NET page that contains the Button can optionally respond to that notification via an event handler.

Этот же шаблон можно использовать для активации функций главной страницы на страницах содержимого:This same pattern can be used to have a master page trigger functionality in its content pages:

  1. Добавьте событие на главную страницу.Add an event to the master page.
  2. Событие следует создавать каждый раз, когда главной странице необходимо взаимодействовать со страницей содержимого.Raise the event whenever the master page needs to communicate with its content page. Например, если главной странице необходимо оповещать страницу содержимого о том, что пользователь удваивает цены, то событие будет создано сразу после удвоения цен.For example, if the master page needs to alert its content page that the user has doubled the prices, its event would be raised immediately after the prices have been doubled.
  3. Создайте обработчик событий на этих страницах содержимого, которые должны выполнить определенное действие.Create an event handler in those content pages that need to take some action.

В оставшейся части этого руководства реализуется пример, описанный в статье Введение. а именно, страница содержимого, в которой перечислены продукты в базе данных и Главная страница, которая содержит элемент управления "Кнопка" для удвоения цен.This remainder of this tutorial implements the example outlined in the Introduction; namely, a content page that lists the products in the database and a master page that includes a Button control to double the prices.

Шаг 1. Отображение продуктов на странице содержимогоStep 1: Displaying Products in a Content Page

Наш первый заказ заключается в создании страницы содержимого, в которой перечислены продукты из базы данных Northwind.Our first order of business is to create a content page that lists the products from the Northwind database. (Мы добавили базу данных Northwind к проекту в предыдущем руководстве, взаимодействуя с главной страницей на странице содержимое.) Сначала добавьте новую страницу ASP.NET в папку ~/Admin с именем Products.aspx, чтобы привязать ее к главной странице Site.master.(We added the Northwind database to the project in the preceding tutorial, Interacting with the Master Page from the Content Page.) Start by adding a new ASP.NET page to the ~/Admin folder named Products.aspx, making sure to bind it to the Site.master master page. На рис. 1 показана обозреватель решений после добавления этой страницы на веб-сайт.Figure 1 shows the Solution Explorer after this page has been added to the website.

добавить новую страницу ASP.NET в папку AdminAdd a New ASP.NET Page to the Admin Folder

Рис. 01. Добавление новой страницы ASP.NET в папку Admin (щелкните, чтобы просмотреть изображение с полным размером)Figure 01: Add a New ASP.NET Page to the Admin Folder (Click to view full-size image)

Помните, что в разделе Указание заголовка, Meta-тегов и других заголовков HTML в учебнике по главной странице мы создали пользовательский класс базовой страницы с именем BasePage, который создает заголовок страницы, если он не задан явно.Recall that in the Specifying the Title, Meta Tags, and Other HTML Headers in the Master Page tutorial we created a custom base page class named BasePage that generates the page's title if it is not explicitly set. Перейдите к классу кода программной части Products.aspx страницы и получите производный от BasePage (а не System.Web.UI.Page).Go to the Products.aspx page's code-behind class and have it derive from BasePage (instead of from System.Web.UI.Page).

Наконец, обновите файл Web.sitemap, включив в него запись для этого занятия.Finally, update the Web.sitemap file to include an entry for this lesson. Добавьте следующую разметку под <siteMapNode> для занятия по взаимодействию с главной страницей:Add the following markup beneath the <siteMapNode> for the Content to Master Page Interaction lesson:

<siteMapNode url="~/Admin/Products.aspx" title="Master to Content Page Interaction" />

Добавление этого элемента <siteMapNode> отражается в списке уроков (см. рис. 5).The addition of this <siteMapNode> element is reflected in the Lessons list (see Figure 5).

Вернитесь к Products.aspx.Return to Products.aspx. В элементе управления содержимым для MainContentдобавьте элемент управления GridView и присвойте ему имя ProductsGrid.In the Content control for MainContent, add a GridView control and name it ProductsGrid. Привяжите GridView к новому элементу управления SqlDataSource с именем ProductsDataSource.Bind the GridView to a new SqlDataSource control named ProductsDataSource.

привязать GridView к новому элементу управления SqlDataSourceBind the GridView to a New SqlDataSource Control

Рис. 02. Привязка GridView к новому элементу управления SqlDataSource (щелкните, чтобы просмотреть изображение с полным размером)Figure 02: Bind the GridView to a New SqlDataSource Control (Click to view full-size image)

Настройте мастер так, чтобы он использовал базу данных Northwind.Configure the wizard so that it uses the Northwind database. Если вы работали с предыдущим руководством, то у вас уже должна быть строка подключения с именем NorthwindConnectionString в Web.config.If you worked through the previous tutorial then you should already have a connection string named NorthwindConnectionString in Web.config. Выберите эту строку подключения из раскрывающегося списка, как показано на рис. 3.Choose this connection string from the drop-down list, as shown in Figure 3.

настроить SqlDataSource для использования базы данных NorthwindConfigure the SqlDataSource to Use the Northwind Database

Рис. 03. Настройка SqlDataSource для использования базы данных Northwind (щелкните, чтобы просмотреть изображение с полным размером)Figure 03: Configure the SqlDataSource to Use the Northwind Database (Click to view full-size image)

Затем укажите инструкцию SELECT элемента управления источником данных, выбрав таблицу Products из раскрывающегося списка и возвращая ProductName и UnitPrice столбцы (см. рис. 4).Next, specify the data source control's SELECT statement by choosing the Products table from the drop-down list and returning the ProductName and UnitPrice columns (see Figure 4). Нажмите кнопку Далее, а затем Готово, чтобы завершить работу мастера настройки источника данных.Click Next and then Finish to complete the Configure Data Source wizard.

возвратить поля ProductName и UnitPrice из таблицы ProductsReturn the ProductName and UnitPrice Fields from the Products Table

Рис. 04. получение полей ProductName и UnitPrice из таблицы Products (щелкните, чтобы просмотреть изображение с полным размером)Figure 04: Return the ProductName and UnitPrice Fields from the Products Table (Click to view full-size image)

Это все.That's all there is to it! После завершения работы мастера Visual Studio добавляет два BoundFields в GridView для отражения двух полей, возвращаемых элементом управления SqlDataSource.After completing the wizard Visual Studio adds two BoundFields to the GridView to mirror the two fields returned by the SqlDataSource control. Ниже приведена разметка элементов управления GridView и SqlDataSource.The GridView and SqlDataSource controls' markup follows. На рис. 5 показаны результаты просмотра в браузере.Figure 5 shows the results when viewed through a browser.

<asp:GridView ID="ProductsGrid" runat="server" AutoGenerateColumns="False" 
 DataSourceID="ProductsDataSource">
 <Columns>
 <asp:BoundField DataField="ProductName" HeaderText="ProductName" 
 SortExpression="ProductName" />
 <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" 
 SortExpression="UnitPrice" />
 </Columns>
</asp:GridView>

<asp:SqlDataSource ID="ProductsDataSource" runat="server" 
 ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" 
 SelectCommand="SELECT [ProductName], [UnitPrice] FROM [Products]">
</asp:SqlDataSource>

каждого продукта и его цены указаны в GridViewEach Product and its Price is Listed in the GridView

Рис. 05. каждый продукт и его цена отображаются в элементе управления GridView (щелкните, чтобы просмотреть изображение с полным размером).Figure 05: Each Product and its Price is Listed in the GridView (Click to view full-size image)

Note

Вы можете очистить внешний вид GridView.Feel free to clean up the appearance of the GridView. Некоторые рекомендации включают форматирование отображаемого значения UnitPrice в виде денежной единицы и использование цветов фона и шрифтов для улучшения внешнего вида сетки.Some suggestions include formatting the displayed UnitPrice value as a currency and using background colors and fonts to improve the grid's appearance. Дополнительные сведения о отображении и форматировании данных в ASP.NET см. в статье руководство по работе с данными.For more information on displaying and formatting data in ASP.NET, refer to my Working with Data tutorial series.

Шаг 2. Добавление кнопки двойной цены на главную страницуStep 2: Adding a Double Prices Button to the Master Page

Следующей задачей является добавление веб-элемента управления Button на главную страницу, при щелчке которого будет удвоена Цена всех продуктов в базе данных.Our next task is to add a Button Web control to the master page that, when clicked, will double the price of all products in the database. Откройте Site.master главную страницу и перетащите кнопку из панели элементов в конструктор, разместив ее под элементом управления RecentProductsDataSource SqlDataSource, который мы добавили в предыдущем руководстве.Open the Site.master master page and drag a Button from the Toolbox onto the Designer, placing it beneath the RecentProductsDataSource SqlDataSource control we added in the previous tutorial. Задайте для свойства ID кнопки значение DoublePrice, а для свойства Text — значение "двойная цена продукта".Set the Button's ID property to DoublePrice and its Text property to "Double Product Prices".

Затем добавьте на главную страницу элемент управления SqlDataSource, назвав его DoublePricesDataSource.Next, add a SqlDataSource control to the master page, naming it DoublePricesDataSource. Эта SqlDataSource будет использоваться для выполнения инструкции UPDATE для удвоения всех цен.This SqlDataSource will be used to execute the UPDATE statement to double all prices. В частности, необходимо задать свойства ConnectionString и UpdateCommand для соответствующей строки подключения и инструкции UPDATE.Specifically, we need to set its ConnectionString and UpdateCommand properties to the appropriate connection string and UPDATE statement. Затем необходимо вызвать метод Update этого элемента управления SqlDataSource при нажатии кнопки DoublePrice.Then we need to call this SqlDataSource control's Update method when the DoublePrice Button is clicked. Чтобы задать свойства ConnectionString и UpdateCommand, выберите элемент управления SqlDataSource и перейдите к окно свойств.To set the ConnectionString and UpdateCommand properties, select the SqlDataSource control and then go to the Properties window. В свойстве ConnectionString перечислены строки подключения, которые уже хранятся в Web.config в раскрывающемся списке. Выберите параметр NorthwindConnectionString, как показано на рис. 6.The ConnectionString property lists those connection strings already stored in Web.config in a drop-down list; choose the NorthwindConnectionString option as shown in Figure 6.

настроить SqlDataSource для использования элемента NorthwindConnectionStringConfigure the SqlDataSource to Use the NorthwindConnectionString

Рис. 6. Настройка SqlDataSource для использования NorthwindConnectionString (щелкните, чтобы просмотреть изображение с полным размером)Figure 06: Configure the SqlDataSource to Use the NorthwindConnectionString (Click to view full-size image)

Чтобы задать свойство UpdateCommand, выберите параметр Упдатекуери в окно свойств.To set the UpdateCommand property, locate the UpdateQuery option in the Properties window. Это свойство, если оно выбрано, отображает кнопку с многоточием; Нажмите эту кнопку для отображения диалогового окна Редактор команд и параметров, показанного на рис. 7.This property, when selected, displays a button with ellipses; click this button to display the Command and Parameter Editor dialog box shown in Figure 7. Введите следующую инструкцию UPDATE в текстовое поле диалогового окна:Type the following UPDATE statement into the dialog box's textbox:

UPDATE Products SET UnitPrice = UnitPrice * 2

При выполнении эта инструкция будет удвоить значение UnitPrice для каждой записи в Products таблице.This statement, when executed, will double the UnitPrice value for each record in the Products table.

задать свойство UpdateCommand для SqlDataSourceSet SqlDataSource's UpdateCommand Property

Рис. 07. задание свойства UpdateCommand для SqlDataSource (щелкните, чтобы просмотреть изображение с полным размером)Figure 07: Set SqlDataSource's UpdateCommand Property (Click to view full-size image)

После задания этих свойств декларативная разметка кнопок и элементов управления SqlDataSource должна выглядеть следующим образом:After setting these properties, your Button and SqlDataSource controls' declarative markup should look similar to the following:

<asp:Button ID="DoublePrice" runat="server" 
 Text="Double Product Prices" />

<asp:SqlDataSource ID="DoublePricesDataSource" runat="server" 
 UpdateCommand="UPDATE Products SET UnitPrice = UnitPrice * 2" 
 ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" 
 ProviderName="<%$ ConnectionStrings:NorthwindConnectionString.ProviderName %>">
</asp:SqlDataSource>

Остается только вызвать метод Update при нажатии кнопки DoublePrice.All that remains is to call its Update method when the DoublePrice Button is clicked. Создайте обработчик событий Click для кнопки DoublePrice и добавьте следующий код:Create a Click event handler for the DoublePrice Button and add the following code:

Protected Sub DoublePrice_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles DoublePrice.Click
 ' Double the prices
 DoublePricesDataSource.Update()
End Sub

Чтобы протестировать эту функцию, посетите страницу ~/Admin/Products.aspx, созданную на шаге 1, и нажмите кнопку "двойная цена продукта".To test this functionality, visit the ~/Admin/Products.aspx page we created in Step 1 and click the "Double Product Prices" button. Нажатие кнопки вызывает обратную передачу и выполняет обработчик событий Click кнопки DoublePrice, что приводит к удвоению цен всех продуктов.Clicking the button causes a postback and executes the DoublePrice Button's Click event handler, doubling the prices of all products. Затем эта страница повторно готовится к просмотру, и в браузере возвращается и повторно отображается разметка.The page is then re-rendered and the markup is returned and re-displayed in the browser. В элементе управления GridView на странице содержимого отображаются те же цены, что и перед нажатием кнопки "двойная цена продукта".The GridView in the content page, however, lists the same prices as before the "Double Product Prices" button was clicked. Это связано с тем, что данные, изначально загруженные в GridView, хранились в состоянии представления, поэтому они не перегружаются при обратных передачах, если не указано иное.This is because the data initially loaded in the GridView had its state stored in view state, so it's not reloaded on postbacks unless instructed otherwise. Если вы посещаете другую страницу, а затем вернитесь на страницу ~/Admin/Products.aspx, вы увидите обновленные цены.If you visit a different page and then return to the ~/Admin/Products.aspx page you'll see the updated prices.

Шаг 3. Создание события при удвоении ценStep 3: Raising an Event When the Prices are Doubled

Поскольку элемент управления GridView на странице ~/Admin/Products.aspx не отражает немедленное удвоение цены, пользователь может понимать, что он не щелкнул кнопку "двойная цена продукта" или не сработал.Because the GridView in the ~/Admin/Products.aspx page does not immediately reflect the price doubling, a user may understandably think that they did not click the "Double Product Prices" button, or that it didn't work. Они могут попытаться нажать кнопку еще несколько раз, снова удвоить цены и снова.They may try clicking the button a few more times, doubling the prices again and again. Чтобы исправить это, необходимо, чтобы в сетке на странице содержимого отображались новые цены сразу после их удвоения.To fix this we need to have the grid in the content page display the new prices immediately after they are doubled.

Как обсуждалось ранее в этом руководстве, необходимо создать событие на главной странице каждый раз, когда пользователь нажимает кнопку DoublePrice.As discussed earlier in this tutorial, we need to raise an event in the master page whenever the user clicks the DoublePrice Button. Событие — это способ, с помощью которого один класс (Издатель события) может уведомить другого набора других классов (подписчиков на события) о том, что произошло нечто интересное.An event is a way for one class (an event publisher) to notify another a set of other classes (the event subscribers) that something interesting has occurred. В этом примере Главная страница является издателем события; Эти страницы содержимого, которые важны при нажатии кнопки DoublePrice, являются подписчиками.In this example, the master page is the event publisher; those content pages that care about when the DoublePrice Button is clicked are the subscribers.

Класс подписывается на событие путем создания обработчика событий, который является методом, выполняемым в ответ на событие, которое вызывается.A class subscribes to an event by creating an event handler, which is a method that is executed in response to the event being raised. Издатель определяет события, которые он вызывает, определяя делегат события.The publisher defines the events he raises by defining an event delegate. Делегат события указывает, какие входные параметры должен принимать обработчик событий.The event delegate specifies what input parameters the event handler must accept. В .NET Framework делегаты событий не возвращают значения и принимают два входных параметра:In the .NET Framework, event delegates do not return any value and accept two input parameters:

  • Object, определяющий источник события;An Object, which identifies the event source, and
  • Класс, производный от System.EventArgsA class derived from System.EventArgs

Второй параметр, передаваемый обработчику событий, может включать дополнительные сведения о событии.The second parameter passed to an event handler can include additional information about the event. Хотя базовый класс EventArgs не передает никаких сведений, .NET Framework включает ряд классов, расширяющих EventArgs и охватывающих дополнительные свойства.While the base EventArgs class does not pass along any information, the .NET Framework includes a number of classes that extend EventArgs and encompass additional properties. Например, экземпляр CommandEventArgs передается обработчикам событий, отвечающим на событие Command, и включает два информационных свойства: CommandArgument и CommandName.For example, a CommandEventArgs instance is passed to event handlers that respond to the Command event, and includes two informational properties: CommandArgument and CommandName.

Note

Дополнительные сведения о создании, вызове и обработке событий см. в разделе события и делегаты и делегаты событий в простом английском языке.For more information on creating, raising, and handling events, see Events and Delegates and Event Delegates in Simple English.

Для определения события используйте следующий синтаксис:To define an event use the following syntax:

Public Event eventName As eventDelegate

Поскольку нам нужно только оповещать страницу содержимого, когда пользователь щелкнул кнопку DoublePrice и не обязан передавать другие дополнительные сведения, мы можем использовать делегат события EventHandler, который определяет обработчик событий, который принимает в качестве второго параметра объект типа System.EventArgs.Because we only need to alert the content page when the user has clicked the DoublePrice Button and do not need to pass along any other additional information, we can use the event delegate EventHandler, which defines an event handler that accepts as its second parameter an object of type System.EventArgs. Чтобы создать событие на главной странице, добавьте следующую строку кода в класс кода программной части главной страницы:To create the event in the master page, add the following line of code to the master page's code-behind class:

Partial Class Site
 Inherits System.Web.UI.MasterPage

 Public Event PricesDoubled As EventHandler
 ...
End Class

Приведенный выше код добавляет открытое событие к главной странице с именем PricesDoubled.The above code adds a public event to the master page named PricesDoubled. Теперь необходимо вызвать это событие после удвоения цен.We now need to raise this event after the prices have been doubled. Для вызова события используйте следующий синтаксис:To raise an event use the following syntax:

RaiseEvent eventName(sender, eventArgs)

Где sender и EventArgs — значения, которые необходимо передать обработчику событий подписчика.Where sender and eventArgs are the values you want to pass to the subscriber's event handler.

Обновите обработчик событий DoublePrice Click следующим кодом:Update the DoublePrice Click event handler with the following code:

Protected Sub DoublePrice_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles DoublePrice.Click
 ' Double the prices
 DoublePricesDataSource.Update()

 ' Refresh RecentProducts
 RecentProducts.DataBind()

 ' Raise the PricesDoubled event
 RaiseEvent PricesDoubled(Me, EventArgs.Empty)
End Sub

Как и ранее, обработчик событий Click начинает с вызова метода Update элемента управления SqlDataSource DoublePricesDataSource, чтобы удвоить цены всех продуктов.As before, the Click event handler starts by calling the DoublePricesDataSource SqlDataSource control's Update method to double the prices of all products. Ниже приведены два добавления к обработчику событий.Following that there are two additions to the event handler. Сначала обновляются данные RecentProducts GridView.First, the RecentProducts GridView's data is refreshed. Этот элемент управления GridView был добавлен на главную страницу в предыдущем руководстве и отображает пять последних добавленных продуктов.This GridView was added to the master page in the preceding tutorial and displays the five most recently-added products. Нам нужно обновить эту сетку, чтобы на ней были показаны только цены с удвоенной вдвоестью для этих пяти продуктов.We need to refresh this grid so that it shows the just-doubled prices for these five products. После этого возникает событие PricesDoubled.Following that, the PricesDoubled event is raised. Ссылка на саму главную страницу (Me) отправляется в обработчик событий в качестве источника события, а пустой объект EventArgs отправляется в качестве аргументов события.A reference to the master page itself (Me) is sent to the event handler as the event source and an empty EventArgs object is sent as the event arguments.

Шаг 4. обработка события на странице содержимогоStep 4: Handling the Event in the Content Page

На этом этапе Главная страница вызывает событие PricesDoubled при каждом нажатии элемента управления "кнопка DoublePrice".At this point the master page raises its PricesDoubled event whenever the DoublePrice Button control is clicked. Однако это всего лишь половина дела — нам по-прежнему нужно справиться с событием на подписчике.However, this is only half the battle - we still need to handle the event in the subscriber. Это включает в себя два шага: создание обработчика событий и добавление кода привязки событий, чтобы при вызове события выполнялся обработчик событий.This involves two steps: creating the event handler and adding event wiring code so that when the event is raised the event handler is executed.

Начните с создания обработчика событий с именем Master_PricesDoubled.Start by creating an event handler named Master_PricesDoubled. Из-за того, как мы определили событие PricesDoubled на главной странице, два входных параметра обработчика событий должны иметь типы Object и EventArgsсоответственно.Because of how we defined the PricesDoubled event in the master page the event handler's two input parameters must be of types Object and EventArgs, respectively. В обработчике событий вызовите метод DataBind ProductsGrid GridView для повторной привязки данных к сетке.In the event handler call the ProductsGrid GridView's DataBind method to rebind the data to the grid.

Private Sub Master_PricesDoubled(ByVal sender As Object, ByVal e As EventArgs)
 ' Rebind data to ProductsGrid
 ProductsGrid.DataBind()
End Sub

Код для обработчика событий завершен, но мы еще не намерены привязать событие PricesDoubled главной страницы к этому обработчику событий.The code for the event handler is complete but we've yet to wire the master page's PricesDoubled event to this event handler. Подписчик связывает событие с обработчиком событий с помощью следующего синтаксиса:The subscriber wires an event to an event handler via the following syntax:

AddHandler publisher.eventName, AddressOf methodName

Издатель — это ссылка на объект, предлагающий событие EventName, а MethodName — имя обработчика событий, определенного на подписчике.publisher is a reference to the object that offers the event eventName, and methodName is the name of the event handler defined in the subscriber.

Этот код привязки событий должен выполняться при первом посещении страницы и последующих обратных передачах, и должен происходить в точке жизненного цикла страницы, которая предшествует моменту возникновения события.This event wiring code must be executed on the first page visit and subsequent postbacks and should occur at a point in the page lifecycle that precedes when the event may be raised. Хорошим временем для добавления кода привязки событий является этап предварительной инициализации, который выполняется очень рано в жизненном цикле страницы.A good time to add event wiring code is in the PreInit stage, which occurs very early in the page lifecycle.

Откройте ~/Admin/Products.aspx и создайте Page_PreInit обработчик событий:Open ~/Admin/Products.aspx and create a Page_PreInit event handler:

Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As EventArgs) Handles Me.PreInit
 ' TODO: Put event wiring logic here
End Sub

Чтобы завершить этот код подключения, требуется программная ссылка на главную страницу со страницы содержимого.In order to complete this wiring code we need a programmatic reference to the master page from the content page. Как отмечалось в предыдущем руководстве, существует два способа сделать это:As noted in the previous tutorial, there are two ways to do this:

  • Путем приведения слабо типизированного свойства Page.Master к соответствующему типу главной страницы;By casting the loosely-typed Page.Master property to the appropriate master page type, or
  • Добавив директиву @MasterType на странице .aspx, а затем используя строго типизированное свойство Master.By adding a @MasterType directive in the .aspx page and then using the strongly-typed Master property.

Давайте будем использовать второй подход.Let's use the latter approach. Добавьте следующую директиву @MasterType в верхнюю часть декларативной разметки страницы:Add the following @MasterType directive to the top of the page's declarative markup:

<%@ MasterType VirtualPath="~/Site.master" %>

Затем добавьте следующий код привязки событий в обработчик событий Page_PreInit:Then add the following event wiring code in the Page_PreInit event handler:

Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As EventArgs) Handles Me.PreInit
 AddHandler Master.PricesDoubled, AddressOf Master_PricesDoubled
End Sub

Используя этот код, элемент управления GridView на странице содержимого обновляется при нажатии кнопки DoublePrice.With this code in place, the GridView in the content page is refreshed whenever the DoublePrice Button is clicked.

На рисунках 8 и 9 показано такое поведение.Figures 8 and 9 illustrate this behavior. На рис. 8 показана страница при первом посещении.Figure 8 shows the page when first visited. Обратите внимание, что значения цен в RecentProducts GridView (в левом столбце главной страницы) и ProductsGrid GridView (на странице содержимого).Note that price values in both the RecentProducts GridView (in the left column of the master page) and the ProductsGrid GridView (in the content page). На рис. 9 показан тот же экран сразу после нажатия кнопки DoublePrice.Figure 9 shows the same screen immediately after the DoublePrice Button has been clicked. Как видите, новые цены мгновенно отражаются в обоих элементах GridView.As you can see, the new prices are instantaneously reflected in both GridViews.

начальные значения ценThe Initial Price Values

Рис. 08. начальные значения цен (щелкните, чтобы просмотреть изображение с полным размером)Figure 08: The Initial Price Values (Click to view full-size image)

в элементах GridView отображаются только непрямые цены.The Just-Doubled Prices are Displayed in the GridViews

Рис. 09. в элементе управления GridView отображаются цены с удвоенной точностью (щелкните, чтобы просмотреть изображение с полным размером)Figure 09: The Just-Doubled Prices are Displayed in the GridViews (Click to view full-size image)

СводкаSummary

В идеале Главная страница и ее страницы содержимого полностью отделены друг от друга и не нуждаются в каком-либо уровне взаимодействия.Ideally, a master page and its content pages are completely separate from one another and require no level of interaction. Однако при наличии главной страницы или страницы содержимого, отображающей данные, которые могут быть изменены на главной странице или странице содержимого, может потребоваться, чтобы эталонная страница отображала страницу содержимого (или наоборот) при изменении данных, чтобы можно было обновить отображение.However, if you have a master page or content page that displays data that can be modified from the master page or content page, then you may need to have the master page alert the content page (or vice-a-versa) when data is modified so that the display can be updated. В предыдущем учебном курсе было показано, как страница содержимого программно взаимодействует со своей главной страницей. в этом учебнике мы рассмотрели, как с помощью главной страницы начать взаимодействие.In the preceding tutorial we saw how to have a content page programmatically interact with its master page; in this tutorial we looked at how to have a master page initiate the interaction.

Хотя программное взаимодействие между содержимым и главной страницей может быть получено из содержимого или с главной страницы, используемый шаблон взаимодействия зависит от происхождения.While programmatic interaction between a content and master page can originate from either the content or master page, the interaction pattern used depends on the origination. Различия обусловлены тем, что страница содержимого имеет одну главную страницу, но Главная страница может содержать много разных страниц содержимого.The differences are due to the fact that a content page has a single master page, but a master page can have many different content pages. Вместо того, чтобы Главная страница напрямую взаимодействовала со страницей содержимого, лучшим подходом является создание на главной странице события, сообщающего о том, что выполнялось какое-то действие.Rather than having a master page directly interact with a content page, a better approach is to have the master page raise an event to signal that some action has taken place. Эти страницы содержимого, которые важны для действия, могут создавать обработчики событий.Those content pages that care about the action can create event handlers.

Поздравляем с программированием!Happy Programming!

Дополнительные материалыFurther Reading

Дополнительные сведения о разделах, обсуждаемых в этом руководстве, см. в следующих ресурсах:For more information on the topics discussed in this tutorial, refer to the following resources:

Об автореAbout the Author

Скотт Митчелл, автор нескольких книг по ASP/ASP. NET и основатель 4GuysFromRolla.com, работал с веб-технологиями майкрософт с 1998.Scott Mitchell, author of multiple ASP/ASP.NET books and founder of 4GuysFromRolla.com, has been working with Microsoft Web technologies since 1998. Скотт работает как независимый консультант, преподаватель и модуль записи.Scott works as an independent consultant, trainer, and writer. Его последняя книга — Sams обучать себя ASP.NET 3,5 за 24 часа.His latest book is Sams Teach Yourself ASP.NET 3.5 in 24 Hours. Скотт можно получить по адресу mitchell@4GuysFromRolla.com или через свой блог по адресу http://ScottOnWriting.NET.Scott can be reached at mitchell@4GuysFromRolla.com or via his blog at http://ScottOnWriting.NET.

Специальная благодарностьSpecial Thanks To

Эта серия руководств была рассмотрена многими полезными рецензентами.This tutorial series was reviewed by many helpful reviewers. Специалист по интересу для этого руководства был Сучи Банержи.Lead reviewer for this tutorial was Suchi Banerjee. Хотите ознакомиться с моими будущими статьями MSDN?Interested in reviewing my upcoming MSDN articles? Если да, расположите строку в mitchell@4GuysFromRolla.comIf so, drop me a line at mitchell@4GuysFromRolla.com