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

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

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

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

ВведениеIntroduction

За прошедшее пять учебных курсов мы рассматривали создание главной страницы, определение областей содержимого, привязку страниц ASP.NET к главной странице и определение содержимого, относящегося к странице.Over the course of the past five tutorials we have looked at how to create a master page, define content regions, bind ASP.NET pages to a master page, and define page-specific content. Когда посетитель запрашивает определенную страницу содержимого, Разметка содержимого и главных страниц подписывается с помощью предохранителя во время выполнения, что приводит к отрисовке унифицированной иерархии элементов управления.When a visitor requests a particular content page, the content and master pages' markup are fused at runtime, resulting in the rendering of a unified control hierarchy. Поэтому мы уже видели один из способов взаимодействия главной страницы и одной из страниц содержимого: на странице содержимого написано разметку для переворота в элементы управления ContentPlaceHolder главной страницы.Therefore, we have already seen one way in which the master page and one of its content pages can interact: the content page spells out the markup to transfuse into the master page's ContentPlaceHolder controls.

Мы еще не изучаем, как Главная страница и страница содержимого могут взаимодействовать программно.What we have yet to examine is how the master page and content page can interact programmatically. Помимо определения разметки для элементов управления ContentPlaceHolder главной страницы, страница содержимого также может назначать значения общедоступным свойствам главной страницы и вызывать ее открытые методы.In addition to defining the markup for the master page's ContentPlaceHolder controls, a content page can also assign values to its master page's public properties and invoke its public methods. Аналогичным образом Главная страница может взаимодействовать со страницами содержимого.Similarly, a master page may interact with its content pages. Хотя программное взаимодействие между главной и страницей содержимого менее распространено, чем взаимодействие между их декларативными разметками, существует множество сценариев, в которых требуется такое программное взаимодействие.While programmatic interaction between a master and content page is less common than the interaction between their declarative markups, there are many scenarios where such programmatic interaction is needed.

В этом учебнике мы рассмотрим, как страница содержимого может программно взаимодействовать со своей главной страницей. в следующем руководстве мы рассмотрим, как Главная страница может взаимодействовать со страницами содержимого.In this tutorial we examine how a content page can programmatically interact with its master page; in the next tutorial we will look at how the master page can similarly interact with its content pages.

Примеры программного взаимодействия между страницей содержимого и ее главной страницейExamples of Programmatic Interaction Between a Content Page and its Master Page

Если определенный регион страницы необходимо настроить отдельно для каждой страницы, мы используем элемент управления ContentPlaceHolder.When a particular region of a page needs to be configured on a page-by-page basis, we use a ContentPlaceHolder control. Но как насчет ситуаций, когда большинству страниц требуется выводить определенные выходные данные, но небольшое количество страниц необходимо настроить для отображения чего-то другого?But what about situations where the majority of pages need to emit a certain output, but a small number of pages need to customize it to show something else? Одним из примеров, которые мы рассматривали в руководстве по использованию нескольких элементов управления ContentPlaceHolder и содержимого по умолчанию , является отображение интерфейса входа на каждой странице.One such example, which we examined in the Multiple ContentPlaceHolders and Default Content tutorial, involves displaying a login interface on each page. Хотя большинство страниц должны включать интерфейс входа в систему, его следует подавлять для нескольких страниц, например: главной страницы входа (Login.aspx); Страница создания учетной записи; и другие страницы, доступные только пользователям, прошедшим проверку подлинности.While most pages should include a login interface, it should be suppressed for a handful of pages, such as: the main login page (Login.aspx); the Create Account page; and other pages that are only accessible to authenticated users. В учебнике несколько элементов управления ContentPlaceHolder и содержимого по умолчанию было показано, как определить содержимое по умолчанию для ContentPlaceHolder на главной странице, а затем переопределить его на страницах, где не требовалось содержимое по умолчанию.The Multiple ContentPlaceHolders and Default Content tutorial showed how to define the default content for a ContentPlaceHolder in the master page and then how to override it in those pages where the default content was not wanted.

Другой вариант — создать открытое свойство или метод на главной странице, который указывает, следует ли отображать или скрывать интерфейс входа.Another option is to create a public property or method within the master page that indicates whether to show or hide the login interface. Например, на главной странице может содержаться открытое свойство с именем ShowLoginUI, значение которого было использовано для задания Visible свойства элемента управления Login на главной странице.For example, the master page might include a public property named ShowLoginUI whose value was used to set the Visible property of the Login control in the master page. Эти страницы содержимого, на которых должен быть подавлен пользовательский интерфейс входа, могут затем программно задать для свойства ShowLoginUI значение false.Those content pages where the login user interface should be suppressed could then programmatically set the ShowLoginUI property to false.

Возможно, наиболее распространенный пример взаимодействия с содержимым и главной страницей происходит, когда данные, отображаемые на главной странице, необходимо обновить после выполнения некоторых действий на странице содержимого.Perhaps the most common example of content and master page interaction occurs when data displayed in the master page needs to be refreshed after some action has transpired in the content page. Рассмотрим главную страницу, которая содержит GridView, в котором отображаются пять последних добавленных записей из определенной таблицы базы данных, а одна из ее страниц содержимого включает интерфейс для добавления новых записей в ту же таблицу.Consider a master page that includes a GridView that displays the five most recently added records from a particular database table, and that one of its content pages includes an interface for adding new records to that same table.

Когда пользователь посещает страницу для добавления новой записи, он видит пять последних добавленных записей, отображаемых на главной странице.When a user visits the page to add a new record, she sees the five most recently added records displayed in the master page. После заполнения значений для столбцов новой записи она отправляет форму.After filling in the values for the new record's columns, she submits the form. Предполагая, что элемент управления GridView на главной странице имеет свойство EnableViewState, для которого установлено значение true (значение по умолчанию), его содержимое перегружается из состояния представления и, следовательно, отображаются пять записей, даже если новая запись была только что добавлена в базу данных.Assuming that the GridView in the master page has its EnableViewState property set to true (the default), its content is reloaded from view state and, consequently, the five same records are displayed even though a newer record was just added to the database. Это может запутать пользователя.This may confuse the user.

Note

Даже если вы отключаете состояние представления GridView для повторной привязки к базовому источнику данных при каждой обратной передаче, он по-прежнему не будет показывать только что добавленную запись, так как данные привязаны к GridView ранее в жизненном цикле страницы, чем при добавлении новой записи в датаб ASE.Even if you disable the GridView's view state so that it rebinds to its underlying data source on every postback, it still won't show the just-added record because the data is bound to the GridView earlier in the page lifecycle than when the new record is added to the database.

Чтобы устранить эту проблему, чтобы только что добавленная запись отображалась в элементе управления GridView на главной странице при обратной передаче, необходимо указать GridView выполнить повторную привязку к своему источнику данных после добавления новой записи в базу данных.To remedy this so that the just-added record is displayed in the master page's GridView on postback we need to instruct the GridView to rebind to its data source after the new record has been added to the database. Для этого требуется взаимодействие между страницами содержимого и главных страниц, так как интерфейс для добавления новой записи (и ее обработчики событий) находится на странице содержимого, но элемент управления GridView, который необходимо обновить, находится на главной странице.This requires interaction between the content and master pages because the interface for adding the new record (and its event handlers) are in the content page but the GridView that needs to be refreshed is in the master page.

Так как обновление отображения главной страницы с помощью обработчика событий на странице содержимого является одной из наиболее распространенных потребностей при взаимодействии содержимого и главной страницы, давайте подробно рассмотрим этот раздел.Because refreshing the master page's display from an event handler in the content page is one of the most common needs for content and master page interaction, let's explore this topic in more detail. Загружаемый файл для этого учебника включает базу данных Microsoft SQL Server 2005 Express Edition с именем NORTHWIND.MDF в папке App_Data веб-сайта.The download for this tutorial includes a Microsoft SQL Server 2005 Express Edition database named NORTHWIND.MDF in the website's App_Data folder. База данных Northwind хранит сведения о продуктах, сотрудниках и продажах для вымышленной компании Northwind Traders.The Northwind database stores product, employee, and sales information for a fictitious company, Northwind Traders.

Шаг 1 демонстрирует отображение пяти последних добавленных продуктов в элементе управления GridView на главной странице.Step 1 walks through displaying the five most recently added products in a GridView in the master page. На шаге 2 создается страница содержимого для добавления новых продуктов.Step 2 creates a content page for adding new products. На шаге 3 рассматривается создание общедоступных свойств и методов на главной странице, а на шаге 4 показано, как программным способом взаимодействовать с этими свойствами и методами со страницы содержимого.Step 3 looks at how to create public properties and methods in the master page, and Step 4 illustrates how to programmatically interface with these properties and methods from the content page.

Note

В этом учебнике не рассматриваются особенности работы с данными в ASP.NET.This tutorial does not delve into the specifics of working with data in ASP.NET. Действия по настройке главной страницы для вывода данных и страницы содержимого для вставки данных завершены, но Бризи.The steps for setting up the master page to display data and the content page for inserting data are complete, yet breezy. Более подробные сведения о отображении и вставке данных, а также об использовании элементов управления SqlDataSource и GridView см. в разделе Дополнительные материалы в конце этого руководства.For a more in-depth look at displaying and inserting data and using the SqlDataSource and GridView controls, consult the resources in the Further Readings section at the end of this tutorial.

Шаг 1. Отображение пяти последних добавленных продуктов на главной страницеStep 1: Displaying the Five Most Recently Added Products in the Master Page

Откройте Site.master главную страницу и добавьте в <div>``leftContent метку и элемент управления GridView.Open the Site.master master page and add a Label and a GridView control to the leftContent <div>. Очистите свойство Text метки, присвойте свойству EnableViewState значение false, а свойству ID значение GridMessage; Задайте для свойства ID GridView значение RecentProducts.Clear out the Label's Text property, set its EnableViewState property to false, and its ID property to GridMessage; set the GridView's ID property to RecentProducts. Затем в конструкторе разверните смарт-тег GridView и выберите привязать его к новому источнику данных.Next, from the Designer, expand the GridView's smart tag and choose to bind it to a new data source. Запустится мастер настройки источника данных.This launches the Data Source Configuration wizard. Поскольку база данных Northwind в папке App_Data является Microsoft SQL Server базой данных, выберите Создание SqlDataSource, выбрав (см. рис. 1); Присвойте RecentProductsDataSourceу SqlDataSource имя.Because the Northwind database in the App_Data folder is a Microsoft SQL Server database, choose to create a SqlDataSource by selecting (see Figure 1); name the SqlDataSource RecentProductsDataSource.

привязать GridView к элементу управления SqlDataSource с именем РецентпродуктсдатасаурцеBind the GridView to a SqlDataSource Control Named RecentProductsDataSource

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

На следующем шаге мы предложим указать базу данных для подключения.The next step asks us to specify what database to connect to. Выберите файл базы данных NORTHWIND.MDF из раскрывающегося списка и нажмите кнопку Далее.Choose the NORTHWIND.MDF database file from the drop-down list and click Next. Так как эта база данных используется впервые, мастер предложит сохранить строку подключения в Web.config.Because this is the first time we've used this database, the wizard will offer to store the connection string in Web.config. Сохраните строку подключения, используя имя NorthwindConnectionString.Have it store the connection string using the name NorthwindConnectionString.

подключиться к базе данных NorthwindConnect to the Northwind Database

Рис. 02. подключение к базе данных Northwind (щелкните, чтобы просмотреть изображение с полным размером)Figure 02: Connect to the Northwind Database (Click to view full-size image)

Мастер настройки источников данных предоставляет два средства, с помощью которых можно указать запрос, используемый для получения данных:The Configure Data Source wizard provides two means by which we can specify the query used to retrieve data:

  • Указав пользовательскую инструкцию SQL или хранимую процедуру илиBy specifying a custom SQL statement or stored procedure, or
  • Путем выбора таблицы или представления и указания возвращаемых столбцовBy picking a table or view and then specifying the columns to return

Поскольку нам нужно вернуть только пять последних добавленных продуктов, необходимо указать пользовательскую инструкцию SQL.Because we want to return just the five most recently added products, we need to specify a custom SQL statement. Используйте следующий запрос SELECT:Use the following SELECT query:

SELECT TOP 5 ProductName, UnitPrice FROM Products ORDER BY ProductID DESC

Ключевое слово TOP 5 возвращает только первые пять записей из запроса.The TOP 5 keyword returns only the first five records from the query. Первичный ключ таблицы Products, ProductID, является столбцом IDENTITY, что гарантирует, что каждый новый продукт, добавляемый в таблицу, будет иметь большее значение, чем предыдущая.The Products table's primary key, ProductID, is an IDENTITY column, which assures us that each new product added to the table will have a larger value than the previous entry. Таким образом, сортировка результатов по ProductID в убывающем порядке возвращает продукты, начиная с последних созданных.Therefore, sorting the results by ProductID in descending order returns the products starting with the most recently created ones.

возвратить пять последних добавленных продуктовReturn the Five Most Recently Added Products

Рис. 03. Возврат пяти последних добавленных продуктов (щелкните, чтобы просмотреть изображение с полным размером)Figure 03: Return the Five Most Recently Added Products (Click to view full-size image)

После завершения работы мастера Visual Studio создает две BoundFields для элемента GridView, чтобы отобразить ProductName и UnitPrice поля, возвращаемые из базы данных.After completing the wizard, Visual Studio generates two BoundFields for the GridView to display the ProductName and UnitPrice fields returned from the database. На этом этапе декларативная разметка главной страницы должна содержать разметку, подобную следующей:At this point your master page's declarative markup should include markup similar to the following:

<asp:Label ID="GridMessage" runat="server" EnableViewState="false"></asp:Label>
<asp:GridView ID="RecentProducts" runat="server" AutoGenerateColumns="False"
 DataSourceID="RecentProductsDataSource">
 <Columns> 
 <asp:BoundField DataField="ProductName" HeaderText="ProductName" 
 SortExpression="ProductName"/> 
 <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice"
 SortExpression="UnitPrice"/> 
 </Columns> 
</asp:GridView> 

<asp:SqlDataSource ID="RecentProductsDataSource" runat="server" 
 ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" 
 SelectCommand="SELECT TOP 5 ProductName, UnitPrice FROM Products ORDER BY ProductID DESC"> 
</asp:SqlDataSource>

Как видите, разметка содержит: Web Control Label (GridMessage); RecentProductsGridView с двумя BoundFields; и элемент управления SqlDataSource, который возвращает пять последних добавленных продуктов.As you can see, the markup contains: the Label Web control (GridMessage); the GridView RecentProducts, with two BoundFields; and a SqlDataSource control that returns the five most recently added products.

После создания этого GridView и настройки элемента управления SqlDataSource перейдите на веб-сайт через браузер.With this GridView created and its SqlDataSource control configured, visit the website through a browser. Как показано на рис. 4, вы увидите сетку в левом нижнем углу, в которой перечислены пять последних добавленных продуктов.As Figure 4 shows, you will see a grid in the lower left corner that lists the five most recently added products.

GridView отображает пять последних добавленных продуктов.The GridView Displays the Five Most Recently Added Products

Рис. 04. Отображение пяти последних добавленных продуктов (щелкните, чтобы просмотреть изображение с полным размером)Figure 04: The GridView Displays the Five Most Recently Added Products (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.

Шаг 2. Создание страницы содержимого для добавления новых продуктовStep 2: Creating a Content Page to Add New Products

Следующая задача — создать страницу содержимого, из которой пользователь может добавить новый продукт в Products таблицу.Our next task is to create a content page from which a user can add a new product to the Products table. Добавьте новую страницу содержимого в папку Admin с именем AddProduct.aspx, чтобы привязать ее к главной странице Site.master.Add a new content page to the Admin folder named AddProduct.aspx, making sure to bind it to the Site.master master page. На рис. 5 показана обозреватель решений после добавления этой страницы на веб-сайт.Figure 5 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

Рис. 05. Добавление новой страницы ASP.NET в папку Admin (щелкните, чтобы просмотреть изображение с полным размером)Figure 05: 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 generated the page's title if it was not explicitly set. Перейдите к классу кода программной части AddProduct.aspx страницы и получите производный от BasePage (а не System.Web.UI.Page).Go to the AddProduct.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 Control ID Naming Issues lesson:

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

Как показано на рис. 6, добавление этого элемента <siteMapNode> отражается в списке «уроки».As shown in Figure 6, the addition of this <siteMapNode> element is reflected in the Lessons list.

Вернитесь к AddProduct.aspx.Return to AddProduct.aspx. В элементе управления содержимым для MainContent ContentPlaceHolder добавьте элемент управления DetailsView и присвойте ему имя NewProduct.In the Content control for the MainContent ContentPlaceHolder, add a DetailsView control and name it NewProduct. Привяжите DetailsView к новому элементу управления SqlDataSource с именем NewProductDataSource.Bind the DetailsView to a new SqlDataSource control named NewProductDataSource. Как и в случае с SqlDataSource на шаге 1, Настройте мастер так, чтобы он использовал базу данных Northwind, и укажите пользовательскую инструкцию SQL.Like with the SqlDataSource in Step 1, configure the wizard so that it uses the Northwind database and choose to specify a custom SQL statement. Поскольку элемент DetailsView будет использоваться для добавления элементов в базу данных, необходимо указать как инструкцию SELECT, так и инструкцию INSERT.Because the DetailsView will be used to add items to the database, we need to specify both a SELECT statement and an INSERT statement. Используйте следующий SELECT запрос:Use the following SELECT query:

SELECT ProductName, UnitPrice FROM Products

Затем на вкладке Вставка добавьте следующую инструкцию INSERT:Then, from the INSERT tab, add the following INSERT statement:

INSERT INTO Products(ProductName, UnitPrice) VALUES(@ProductName, @UnitPrice)

После завершения работы мастера перейдите к смарт-тегу DetailsView и установите флажок "включить вставку".After completing the wizard go to the DetailsView's smart tag and check the "Enable Inserting" checkbox. При этом в элемент DetailsView добавляется CommandField со свойством ShowInsertButton, установленным в значение true.This adds a CommandField to the DetailsView with its ShowInsertButton property set to true. Так как эта DetailsView будет использоваться исключительно для вставки данных, установите для свойства DefaultMode элемента DetailsView значение Insert.Because this DetailsView will be used solely for inserting data, set the DetailsView's DefaultMode property to Insert.

Это все.That's all there is to it! Давайте протестируем эту страницу.Let's test this page. Перейдите AddProduct.aspx через браузер, введите имя и цену (см. рис. 6).Visit AddProduct.aspx through a browser, enter a name and price (see Figure 6).

добавить новый продукт в базу данныхAdd a New Product to the Database

Рис. 6. Добавление нового продукта в базу данных (щелкните, чтобы просмотреть изображение с полным размером)Figure 06: Add a New Product to the Database (Click to view full-size image)

После ввода имени и цены нового продукта нажмите кнопку Вставить.After typing in the name and price for your new product, click the Insert button. В результате форма передается обратной передаче.This causes the form to postback. При обратной передаче выполняется инструкция INSERT элемента управления SqlDataSource. два параметра заполняются значениями, вводимых пользователем в двух элементах TextBox элемента управления DetailsView.On postback, the SqlDataSource control's INSERT statement is executed; its two parameters are populated with the user-entered values in the DetailsView's two TextBox controls. К сожалению, нет визуальной обратной связи о том, что произошла Вставка.Unfortunately, there is no visual feedback that an insert has occurred. Было бы неплохо отображать сообщение, подтверждая Добавление новой записи.It would be nice to have a message displayed, confirming that a new record has been added. Я оставлю это в качестве упражнения для читателя.I leave this as an exercise for the reader. Кроме того, после добавления новой записи из элемента управления DetailsView в элементе управления GridView на главной странице по-прежнему отображаются те же пять записей, что и раньше. она не включает только что добавленную запись.Also, after adding a new record from the DetailsView the GridView in the master page still shows the same five records as before; it does not include the just-added record. Мы рассмотрим, как устранить эту проблему на следующих шагах.We'll examine how to remedy this in the upcoming steps.

Note

Помимо добавления некоторой формы визуального отзыва о том, что вставка прошла успешно, я рекомендую также обновить интерфейс вставки DetailsView, чтобы включить проверку.In addition to adding some form of visual feedback that the insert has succeeded, I'd encourage you to also update the DetailsView's inserting interface to include validation. В настоящее время проверка не выполняется.Currently, there is no validation. Если пользователь вводит недопустимое значение для поля UnitPrice, например "слишком дорого", при обратной передаче будет создано исключение, когда система попытается преобразовать эту строку в десятичный.If a user enters an invalid value for the UnitPrice field, such as "Too expensive," an exception will be thrown on postback when the system attempts to convert that string into a decimal. Дополнительные сведения о настройке интерфейса вставки см. в руководстве по настройке интерфейса изменения данных из статьи учебник по работе с данными.For more information on customizing the inserting interface, refer to the Customizing the Data Modification Interface tutorial from my Working with Data tutorial series.

Шаг 3. Создание общедоступных свойств и методов на главной страницеStep 3: Creating Public Properties and Methods in the Master Page

На шаге 1 мы добавили веб-элемент управления Label с именем GridMessage над GridView на главной странице.In Step 1 we added a Label Web control named GridMessage above the GridView in the master page. Эта метка предназначена для необязательного вывода сообщения.This Label is intended to optionally display a message. Например, после добавления новой записи в таблицу Products может потребоваться отобразить сообщение с текстом "ProductName Добавлено в базу данных".For example, after adding a new record to the Products table, we might want to show a message that reads: "ProductName has been added to the database." Вместо того чтобы жестко кодировать текст для этой метки на главной странице, может потребоваться настроить сообщение на странице содержимого.Rather than hard-code the text for this Label in the master page, we might want the message to be customizable by the content page.

Поскольку элемент управления "метка" реализуется как защищенная переменная-член на главной странице, доступ к которой невозможен непосредственно из страниц содержимого.Because the Label control is implemented as a protected member variable within the master page it cannot be accessed directly from content pages. Для работы с меткой в главной странице со страницы содержимого (или для любого веб-элемента управления на главной странице) необходимо создать открытое свойство на главной странице, предоставляющее веб-элемент управления, или в качестве прокси, с помощью которого можно получить одно из его свойств. обращения.In order to work with the Label within a master page from the content page (or, for that matter, any Web control in the master page) we need to create a public property in the master page that exposes the Web control or serves as a proxy by which one of its properties can be accessed. Добавьте следующий синтаксис в класс кода программной части главной страницы, чтобы предоставить свойство Text Метки:Add the following syntax to the master page's code-behind class to expose the Label's Text property:

public string GridMessageText 
{ 
    get
    { 
        return GridMessage.Text; 
    } 
    set 
    {
        GridMessage.Text = value; 
    }
}

При добавлении новой записи в таблицу Products из страницы содержимого RecentProducts GridView на главной странице необходимо повторно привязать к базовому источнику данных.When a new record is added to the Products table from a content page the RecentProducts GridView in the master page needs to rebind to its underlying data source. Чтобы повторно привязать GridView, нужно вызвать его метод DataBind.To rebind the GridView call its DataBind method. Поскольку элемент управления GridView на главной странице не доступен для страниц содержимого программным способом, необходимо создать открытый метод на главной странице, который при вызове повторно привязывает данные к GridView.Because the GridView in the master page is not programmatically accessible to the content pages, we need to create a public method in the master page that, when called, rebinds the data to the GridView. Добавьте следующий метод в класс кода программной части главной страницы:Add the following method to the master page's code-behind class:

public void RefreshRecentProductsGrid() 
{ 
    RecentProducts.DataBind();
}

С помощью свойства GridMessageText и RefreshRecentProductsGrid метода любая страница содержимого может программно задавать или считывать значение свойства Text метки GridMessage или повторно привязывать данные к RecentProducts GridView.With the GridMessageText property and RefreshRecentProductsGrid method in place, any content page can programmatically set or read the value of the GridMessage Label's Text property or rebind the data to the RecentProducts GridView. На шаге 4 рассматривается доступ к общим свойствам и методам главной страницы со страницы содержимого.Step 4 examines how to access the master page's public properties and methods from a content page.

Note

Не забудьте пометить свойства и методы главной страницы как public.Don't forget to mark the master page's properties and methods as public. Если не указать явно эти свойства и методы как public, они будут недоступны со страницы содержимого.If you do not explicitly denote these properties and methods as public, they will not be accessible from the content page.

Шаг 4. вызов открытых членов главной страницы из страницы содержимогоStep 4: Calling the Master Page's Public Members from a Content Page

Теперь, когда на главной странице имеются необходимые открытые свойства и методы, мы готовы к вызову этих свойств и методов со страницы содержимого AddProduct.aspx.Now that the master page has the necessary public properties and methods, we're ready to invoke these properties and methods from the AddProduct.aspx content page. В частности, необходимо задать свойство GridMessageText главной страницы и вызвать его метод RefreshRecentProductsGrid после добавления нового продукта в базу данных.Specifically, we need to set the master page's GridMessageText property and call its RefreshRecentProductsGrid method after the new product has been added to the database. Все веб-элементы управления данными ASP.NET срабатывают события непосредственно до и после выполнения различных задач, что упрощает разработчикам страниц выполнение некоторых программных действий до или после выполнения задачи.All the ASP.NET data Web controls fire events immediately before and after completing various tasks, which make it easy for page developers to take some programmatic action either before or after the task. Например, когда пользователь нажимает кнопку вставки DetailsView, при обратной передаче DetailsView создает событие ItemInserting перед началом процесса вставки.For example, when the end user clicks the DetailsView's Insert button, on postback the DetailsView raises its ItemInserting event before beginning the inserting workflow. Затем она вставляет запись в базу данных.It then inserts the record into the database. После этого DetailsView создает событие ItemInserted.Following that, the DetailsView raises its ItemInserted event. Поэтому, чтобы работать с главной страницей после добавления нового продукта, создайте обработчик событий для события ItemInserted DetailsView.Therefore, in order to work with the master page after the new product has been added, create an event handler for the DetailsView's ItemInserted event.

Страница содержимого может программно взаимодействовать с главной страницей двумя способами.There are two ways that a content page can programmatically interface with its master page:

  • С помощью свойства Page.Master, которое возвращает слабо типизированную ссылку на главную страницу илиUsing the Page.Master property, which returns a loosely-typed reference to the master page, or
  • Укажите тип главной страницы страницы или путь к файлу с помощью директивы @MasterType; Это автоматически добавит строго типизированное свойство к странице с именем Master.Specify the page's master page type or file path via a @MasterType directive; this automatically adds a strongly-typed property to the page named Master.

Давайте рассмотрим оба подхода.Let's examine both approaches.

Использование слабо типизированного свойстваPage.MasterUsing the Loosely-TypedPage.MasterProperty

Все веб-страницы ASP.NET должны быть производными от класса Page, который находится в пространстве имен System.Web.UI.All ASP.NET web pages must derive from the Page class, which is located in the System.Web.UI namespace. Класс Page включает свойствоMaster , которое возвращает ссылку на главную страницу страницы.The Page class includes a Master property that returns a reference to the page's master page. Если на странице нет главной страницы, Master возвращает null.If the page does not have a master page Master returns null.

Свойство Master возвращает объект типа MasterPage (также расположенный в пространстве имен System.Web.UI), который является базовым типом, от которого наследуются все главные страницы.The Master property returns an object of type MasterPage (also located in the System.Web.UI namespace) which is the base type from which all master pages derive from. Таким образом, чтобы использовать общие свойства или методы, определенные на главной странице веб-сайта, необходимо привести MasterPageный объект, возвращаемый свойством Master, к соответствующему типу.Therefore, to use public properties or methods defined in our website's master page we must cast the MasterPage object returned from the Master property to the appropriate type. Так как мы назвали наш файл главной страницы Site.master, класс кода программной части имел имя Site.Because we named our master page file Site.master, the code-behind class was named Site. Таким образом, следующий код приводит свойство Page.Master к экземпляру класса сайта.Therefore, the following code casts the Page.Master property to an instance of the Site class.

// Cast the loosely-typed Page.Master property and then set the GridMessageText property 
Site myMasterPage = Page.Master as Site;

Теперь, после приведения слабо типизированного свойства Page.Master к типу Site мы можем ссылаться на свойства и методы, относящиеся к сайту.Now that we have casted the loosely-typed Page.Master property to the Site type we can reference the properties and methods specific to Site. Как показано на рис. 7, свойство public GridMessageText отображается в раскрывающемся списке IntelliSense.As Figure 7 shows, the public property GridMessageText appears in the IntelliSense drop-down.

IntelliSense отображает общие свойства и методы главной страницыIntelliSense Shows our Master Page's Public Properties and Methods

Рис. 07. IntelliSense отображает общие свойства и методы главной страницы (щелкните, чтобы просмотреть изображение с полным размером)Figure 07: IntelliSense Shows our Master Page's Public Properties and Methods (Click to view full-size image)

Note

Если вы назвали файл главной страницы MasterPage.master то имя класса кода программной части главной страницы будет MasterPage.If you named your master page file MasterPage.master then the master page's code-behind class name is MasterPage. Это может привести к неоднозначному коду при приведении типа System.Web.UI.MasterPage к классу MasterPage.This can lead to ambiguous code when casting from the type System.Web.UI.MasterPage to your MasterPage class. Вкратце, необходимо полностью определить тип, к которому выполняется приведение, что может быть немного сложным при использовании модели проекта веб-сайта.In short, you need to fully qualify the type you are casting to, which can be a little tricky when using the Web Site Project model. Мне пришлось бы убедиться, что при создании главной страницы вы назначите ей имя, отличное от MasterPage.master или, еще лучше создать строго типизированную ссылку на главную страницу.My suggestion would be to either make sure that when you create your master page you name it something other than MasterPage.master or, even better, create a strongly-typed reference to the master page.

Создание строго типизированной ссылки с помощью директивы@MasterTypeCreating a Strongly-Typed Reference with the@MasterTypeDirective

Если увидеть, что класс кода программной части страницы ASP.NET является разделяемым классом (Обратите внимание на ключевое слово partial в определении класса).If you look closely you can see that an ASP.NET page's code-behind class is a partial class (note the partial keyword in the class definition). Разделяемые классы появились в C# и Visual Basic with.NET Framework 2,0 и, в двух словах, позволяют определять члены класса в нескольких файлах.Partial classes were introduced in C# and Visual Basic with.NET Framework 2.0 and, in a nutshell, allow for a class's members to be defined across multiple files. Пример файла класса кода программной части — AddProduct.aspx.cs, например, содержит код, который разработчик страницы создает.The code-behind class file - AddProduct.aspx.cs, for example - contains the code that we, the page developer, create. Помимо нашего кода, ядро ASP.NET автоматически создает отдельный файл класса со свойствами и обработчиками событий в, который преобразует декларативную разметку в иерархию классов страницы.In addition to our code, the ASP.NET engine automatically creates a separate class file with properties and event handlers in that translate the declarative markup into the page's class hierarchy.

Автоматическое создание кода, возникающее при каждом посещении страницы ASP.NET, создает условия для некоторых довольно интересных и полезных возможностей.The automatic code generation that occurs whenever an ASP.NET page is visited paves the way for some rather interesting and useful possibilities. В случае с главными страницами, если мы говорим ASP.NET Engine, какая Главная страница используется нашей страницей содержимого, она создает строго типизированное свойство Master для нас.In the case of master pages, if we tell the ASP.NET engine what master page is being used by our content page it generates a strongly-typed Master property for us.

Используйте директиву@MasterType , чтобы сообщить подсистеме ASP.NET типа главной страницы страницы содержимого.Use the @MasterType directive to inform the ASP.NET engine of the content page's master page type. Директива @MasterType может принимать либо имя типа главной страницы, либо ее путь к файлу.The @MasterType directive can accept either the type name of the master page or its file path. Чтобы указать, что страница AddProduct.aspx использует Site.master в качестве главной страницы, добавьте следующую директиву в начало AddProduct.aspx:To specify that the AddProduct.aspx page uses Site.master as its master page, add the following directive to the top of AddProduct.aspx:

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

Эта директива указывает обработчику ASP.NET добавить строго типизированную ссылку на главную страницу через свойство с именем Master.This directive instructs the ASP.NET engine to add a strongly-typed reference to the master page through a property named Master. С помощью директивы @MasterType можно вызвать открытые свойства и методы Site.master главной страницы напрямую через свойство Master без приведения.With the @MasterType directive in place, we can call the Site.master master page's public properties and methods directly through the Master property without any casts.

Note

Если опустить директиву @MasterType, синтаксис Page.Master и Master возвращают одно и то же действие: слабо типизированный объект на главную страницу страницы.If you omit the @MasterType directive, the syntax Page.Master and Master return the same thing: a loosely-typed object to the page's master page. Если включить директиву @MasterType, Master возвращает строго типизированную ссылку на указанную главную страницу.If you include the @MasterType directive then Master returns a strongly-typed reference to the specified master page. Однако Page.Masterпо-прежнему возвращает слабо типизированную ссылку.Page.Master, however, still returns a loosely-typed reference. Более подробные сведения о том, почему это так, а также о том, как будет создаваться свойство Master при включении директивы @MasterType, см. в записи блога K. Скотт аллен @MasterType в ASP.NET 2,0.For a more thorough look at why this is the case and how the Master property is constructed when the @MasterType directive is included, see K. Scott Allen's blog entry @MasterType in ASP.NET 2.0.

Обновление главной страницы после добавления нового продуктаUpdating the Master Page After Adding a New Product

Теперь, когда известно, как вызывать общие свойства и методы главной страницы из страницы содержимого, мы готовы обновить страницу AddProduct.aspx, чтобы обновление главной страницы было выполнено после добавления нового продукта.Now that we know how to invoke a master page's public properties and methods from a content page, we're ready to update the AddProduct.aspx page so that the master page is refreshed after adding a new product. В начале шага 4 мы создали обработчик для события ItemInserting элемента управления DetailsView, которое выполняется сразу после добавления нового продукта в базу данных.At the beginning of Step 4 we created an event handler for the DetailsView control's ItemInserting event, which executes immediately after the new product has been added to the database. Добавьте следующий код в этот обработчик событий:Add the following code to that event handler:

protected void NewProduct_ItemInserted(object sender, DetailsViewInsertedEventArgs e) 
{ 
    // Cast the loosely-typed Page.Master property and then set the GridMessageText property 
    Site myMasterPage = Page.Master as Site; 
    myMasterPage.GridMessageText = string.Format("{0} added to grid...", e.Values["ProductName"]); 
    // Use the strongly-typed Master property 
    Master.RefreshRecentProductsGrid();
}

Приведенный выше код использует как слабо типизированное свойство Page.Master, так и свойство Master со строгой типизацией.The above code uses both the loosely-typed Page.Master property and the strongly-typed Master property. Обратите внимание, что для свойства GridMessageText задано значение "ProductName Добавлено в Grid...". Значения только что добавленного продукта доступны через коллекцию e.Values; Как видите, доступ к только что добавленному ProductName значение осуществляется через e.Values["ProductName"].Note that the GridMessageText property is set to "ProductName added to grid..." The just-added product's values are accessible through the e.Values collection; as you can see, the just-added ProductName value is accessed via e.Values["ProductName"].

На рис. 8 показана страница AddProduct.aspx сразу после добавления нового продукта Скотта Soda — в базу данных.Figure 8 shows the AddProduct.aspx page immediately after a new product - Scott's Soda - has been added to the database. Обратите внимание, что только что добавленное название продукта указано в метке главной страницы, а элемент управления GridView обновлен для включения продукта и его цены.Note that the just-added product name is noted in the master page's Label and that the GridView has been refreshed to include the product and its price.

метку главной страницы и GridView показывать только что добавленный продуктThe Master Page's Label and GridView Show the Just-Added Product

Рис. 08. метка главной страницы и GridView Показать только что добавленный продукт (щелкните, чтобы просмотреть изображение с полным размером)Figure 08: The Master Page's Label and GridView Show the Just-Added Product (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. Хотя главные страницы и страницы содержимого должны быть спроектированы с учетом этой цели, существует ряд распространенных сценариев, в которых страница содержимого должна взаимодействовать с главной страницей.While master pages and content pages should be designed with that goal in mind, there are a number of common scenarios in which a content page must interface with its master page. Одна из наиболее распространенных причин — обновление определенной части главной страницы на основе некоторых действий, которые производятся на странице содержимого.One of the most common reasons centers around updating a particular portion of the master page display based on some action that transpired in the content page.

Хорошая новость заключается в том, что страница содержимого по-своему относительно проста в программной взаимодействии со своей главной страницей.The good news is that it's relatively straightforward to have a content page programmatically interact with its master page. Начните с создания общих свойств или методов на главной странице, которые инкапсулируют функциональные возможности, которые должны вызываться страницей содержимого.Start by creating public properties or methods in the master page that encapsulate the functionality that needs to be invoked by a content page. Затем на странице содержимое получите доступ к свойствам и методам главной страницы через слабо типизированное свойство Page.Master или используйте директиву @MasterType для создания строго типизированной ссылки на главную страницу.Then, in the content page, access the master page's properties and methods through the loosely-typed Page.Master property or use the @MasterType directive to create a strongly-typed reference to the master page.

В следующем учебном курсе рассматривается, как настроить главную страницу программным способом для взаимодействия с одной из страниц содержимого.In the next tutorial we examine how to have the master page programmatically interact with one of its content pages.

Поздравляем с программированием!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 Zack Jones. Хотите ознакомиться с моими будущими статьями MSDN?Interested in reviewing my upcoming MSDN articles? Если да, расположите строку в mitchell@4GuysFromRolla.comIf so, drop me a line at mitchell@4GuysFromRolla.com