Декларативные параметры (VB)Declarative Parameters (VB)

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

Скачивание примера приложения или Загрузка PDF-файлаDownload Sample App or Download PDF

В этом учебнике мы продемонстрируем, как использовать набор параметров в жестко запрограммированное значение для выбора данных, отображаемых в элементе управления DetailsView.In this tutorial we'll illustrate how to use a parameter set to a hard-coded value to select the data to display in a DetailsView control.

ВведениеIntroduction

В последнем учебном курсе мы рассматривали отображение данных с элементами управления GridView, DetailsView и FormView, привязанными к элементу управления ObjectDataSource, вызвавшему метод GetProducts() из класса ProductsBLL.In the last tutorial we looked at displaying data with the GridView, DetailsView, and FormView controls bound to an ObjectDataSource control that invoked the GetProducts() method from the ProductsBLL class. Метод GetProducts() возвращает строго типизированный объект DataTable, заполненный всеми записями из таблицы Products базы данных Northwind.The GetProducts() method returns a strongly-typed DataTable populated with all of the records from the Northwind database's Products table. Класс ProductsBLL содержит дополнительные методы для возврата только подмножества продуктов — GetProductByProductID(productID), GetProductsByCategoryID(categoryID)и GetProductsBySupplierID(supplierID).The ProductsBLL class contains additional methods for returning just subsets of the products - GetProductByProductID(productID), GetProductsByCategoryID(categoryID), and GetProductsBySupplierID(supplierID). Эти три метода предполагают входной параметр, указывающий, как отфильтровать возвращенные сведения о продукте.These three methods expect an input parameter indicating how to filter the returned product information.

ObjectDataSource можно использовать для вызова методов, которые предполагают входные параметры, но для этого необходимо указать, откуда берутся значения этих параметров.The ObjectDataSource can be used to invoke methods that expect input parameters, but in order to do so we must specify where the values for these parameters come from. Значения параметров могут быть жестко запрограммированы или могут поступать из различных динамических источников, включая значения QueryString, переменные сеанса, значение свойства веб-элемента управления на странице или другие.The parameter values can be hard-coded or can come from a variety of dynamic sources, including: querystring values, Session variables, the property value of a Web control on the page, or others.

В этом руководстве начнем с демонстрации того, как использовать набор параметров для жестко запрограммированного значения.For this tutorial let's start by illustrating how to use a parameter set to a hard-coded value. В частности, мы рассмотрим добавление элемента DetailsView на страницу, на котором отображаются сведения о конкретном продукте, а именно Chef Anton's Gumbo, который имеет ProductID 5.Specifically, we'll look at adding a DetailsView to the page that displays information about a specific product, namely Chef Anton's Gumbo Mix, which has a ProductID of 5. Далее мы посмотрим, как задать значение параметра на основе веб-элемента управления.Next, we'll see how to set the parameter value based on a Web control. В частности, мы будем использовать текстовое поле для ввода пользователя в страну, после чего она может нажать кнопку, чтобы просмотреть список поставщиков, находящихся в этой стране.In particular, we'll use a TextBox to let the user type in a country, after which they can click a Button to see the list of suppliers that reside in that country.

Использование жестко запрограммированного значения параметраUsing a Hard-Coded Parameter Value

Для первого примера Начните с добавления элемента управления DetailsView на страницу DeclarativeParams.aspx в папке BasicReporting.For the first example, start by adding a DetailsView control to the DeclarativeParams.aspx page in the BasicReporting folder. Из смарт-тега DetailsView выберите <создать источник данных> из раскрывающегося списка и выберите Добавление элемента управления ObjectDataSource.From the DetailsView's smart tag, select <New data source> from the drop-down list and choose to add an ObjectDataSource.

добавить элемент управления ObjectDataSource на страницуAdd an ObjectDataSource to the Page

Рис. 1. Добавление элемента управления ObjectDataSource на страницу (щелкните, чтобы просмотреть изображение с полным размером)Figure 1: Add an ObjectDataSource to the Page (Click to view full-size image)

Будет автоматически запущен мастер выбора источника данных элемента управления ObjectDataSource.This will automatically start the ObjectDataSource control's Choose Data Source wizard. Выберите класс ProductsBLL на первом экране мастера.Select the ProductsBLL class from the first screen of the wizard.

выберите класс ProductsBLLSelect the ProductsBLL Class

Рис. 2. выбор класса ProductsBLL (щелкните, чтобы просмотреть изображение с полным размером)Figure 2: Select the ProductsBLL Class (Click to view full-size image)

Так как нам нужно отобразить сведения о конкретном продукте, мы хотим использовать метод GetProductByProductID(productID).Since we want to display information about a particular product we want to use the GetProductByProductID(productID) method.

выбрать метод Жетпродуктбипродуктид (productID)Choose the GetProductByProductID(productID) method

Рис. 3. выбор метода GetProductByProductID(productID) (щелкните, чтобы просмотреть изображение с полным размером)Figure 3: Choose the GetProductByProductID(productID) method (Click to view full-size image)

Так как выбранный метод включает параметр, в мастере есть еще один экран, где вам будет предложено определить значение, которое будет использоваться для параметра.Since the method we selected includes a parameter, there's one more screen for the wizard, where we're asked to define the value to be used for the parameter. В списке слева отображаются все параметры для выбранного метода.The list on the left shows all of the parameters for the selected method. Для GetProductByProductID(productID) существует только один productID.For GetProductByProductID(productID) there's only one productID. Справа можно указать значение для выбранного параметра.On the right we can specify the value for the selected parameter. Раскрывающийся список Источник параметра перечисляет различные возможные источники для значения параметра.The parameter source drop-down list enumerates the various possible sources for the parameter value. Так как нам нужно указать жестко заданное значение 5 для параметра productID, оставьте Источник параметра как нет и введите 5 в текстовое поле DefaultValue.Since we want to specify a hard-coded value of 5 for the productID parameter, leave the Parameter source as None and enter 5 into the DefaultValue textbox.

жестко запрограммированное значение параметра, равное 5, будет использоваться для параметра productID.A Hard-Coded Parameter Value of 5 Will Be Used for the productID Parameter

Рис. 4. жестко запрограммированное значение параметра, равное 5, будет использоваться для параметра productID (щелкните, чтобы просмотреть изображение с полным размером)Figure 4: A Hard-Coded Parameter Value of 5 Will Be Used for the productID Parameter (Click to view full-size image)

После завершения работы мастера настройки источника данных декларативная разметка элемента управления ObjectDataSource включает объект Parameter в коллекцию SelectParameters для каждого входного параметра, ожидаемого методом, определенным в свойстве SelectMethod.After completing the Configure Data Source wizard, the ObjectDataSource control's declarative markup includes a Parameter object in the SelectParameters collection for each of the input parameters expected by the method defined in the SelectMethod property. Так как метод, который мы используем в этом примере, принимает только один входной параметр, parameterID, здесь есть только одна запись.Since the method we're using in this example expects just a single input parameter, parameterID, there's only one entry here. Коллекция SelectParameters может содержать любой класс, производный от класса Parameter в пространстве имен System.Web.UI.WebControls.The SelectParameters collection can contain any class that derives from the Parameter class in the System.Web.UI.WebControls namespace. Для жестко запрограммированных значений параметров используется базовый класс Parameter, но для других параметров источника параметра используется производный Parameter класс. При необходимости можно также создать собственные пользовательские типы параметров.For hard-coded parameter values the base Parameter class is used, but for the other parameter source options a derived Parameter class is used; you can also create your own custom parameter types, if needed.

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
    SelectMethod="GetProductByProductID" TypeName="ProductsBLL">
    <SelectParameters>
        <asp:Parameter DefaultValue="5"
           Name="productID" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

Note

Если вы используете собственный компьютер, декларативная разметка, отображаемая на этом этапе, может включать значения свойств InsertMethod, UpdateMethodи DeleteMethod, а также DeleteParameters.If you're following along on your own computer the declarative markup you see at this point may include values for the InsertMethod, UpdateMethod, and DeleteMethod properties, as well as DeleteParameters. Мастер выбора источника данных ObjectDataSource автоматически задает методы из ProductBLL, которые будут использоваться для вставки, обновления и удаления, поэтому, если вы явно не сняли их, они будут добавлены в разметку выше.The ObjectDataSource's Choose Data Source wizard automatically specifies the methods from the ProductBLL to use for inserting, updating, and deleting, so unless you explicitly cleared those out, they'll be included in the markup above.

При посещении этой страницы веб-элемент управления данными будет вызывать метод Select ObjectDataSource, который будет вызывать метод GetProductByProductID(productID) класса ProductsBLL, используя жестко заданное значение 5 для входного параметра productID.When visiting this page, the data Web control will invoke the ObjectDataSource's Select method, which will call the ProductsBLL class's GetProductByProductID(productID) method using the hard-coded value of 5 for the productID input parameter. Метод возвратит строго типизированный ProductDataTable объект, содержащий одну строку со сведениями о Gumbo Anton's Chef (продукт с ProductID 5).The method will return a strongly-typed ProductDataTable object that contains a single row with information about Chef Anton's Gumbo Mix (the product with ProductID 5).

сведения о наборе Gumbo Anton's ChefInformation About Chef Anton's Gumbo Mix are Displayed

Рис. 5. отображаются сведения о наборе Gumbo Chef Anton's (щелкните, чтобы просмотреть изображение с полным размером)Figure 5: Information About Chef Anton's Gumbo Mix are Displayed (Click to view full-size image)

Присвоение параметру значения свойства веб-элемента управленияSetting the Parameter Value to the Property Value of a Web Control

Значения параметров ObjectDataSource также могут быть заданы на основе значения веб-элемента управления на странице.The ObjectDataSource's parameter values can also be set based on the value of a Web control on the page. Чтобы проиллюстрировать это, рассмотрим элемент управления GridView, в котором перечислены все поставщики, расположенные в стране, указанной пользователем.To illustrate this, let's have a GridView that lists all of the suppliers that are located in a country specified by the user. Чтобы сделать это, добавьте на страницу текстовое поле, в которое пользователь может ввести название страны.To accomplish this start by adding a TextBox to the page into which the user can enter a country name. Присвойте свойству ID этого элемента управления TextBox значение CountryName.Set this TextBox control's ID property to CountryName. Также добавьте веб-элемент управления Button.Also add a Button Web control.

добавить текстовое поле на страницу с ИДЕНТИФИКАТОРом CountryNameAdd a TextBox to the Page with ID CountryName

Рис. 6. Добавление на страницу текстового поля с ID CountryName (щелкните, чтобы просмотреть изображение с полным размером)Figure 6: Add a TextBox to the Page with ID CountryName (Click to view full-size image)

Затем добавьте элемент управления GridView на страницу и в смарт-теге выберите Добавление нового элемента ObjectDataSource.Next, add a GridView to the page and, from the smart tag, choose to add a new ObjectDataSource. Так как мы хотим отобразить сведения о поставщиках, выберите класс SuppliersBLL на первом экране мастера.Since we want to display supplier information select the SuppliersBLL class from the wizard's first screen. На втором экране выберите метод GetSuppliersByCountry(country).From the second screen, pick the GetSuppliersByCountry(country) method.

выбрать метод Жетсупплиерсбикаунтри (Country)Choose the GetSuppliersByCountry(country) Method

Рис. 7. выбор метода GetSuppliersByCountry(country) (щелкните, чтобы просмотреть изображение с полным размером)Figure 7: Choose the GetSuppliersByCountry(country) Method (Click to view full-size image)

Так как метод GetSuppliersByCountry(country) имеет входной параметр, мастер снова включает в себя окончательный экран для выбора значения параметра.Since the GetSuppliersByCountry(country) method has an input parameter, the wizard once again includes a final screen for choosing the parameter value. На этот раз задайте источнику параметров значение Control.This time, set the Parameter source to Control. При этом раскрывающийся список ControlID будет заполнен именами элементов управления на странице. Выберите элемент управления CountryName из списка.This will populate the ControlID drop-down list with the names of the controls on the page; select the CountryName control from the list. При первом посещении страницы текстовое поле CountryName будет пустым, поэтому результаты не будут возвращены и ничего не отобразится.When the page is first visited the CountryName TextBox will be blank, so no results are returned and nothing is displayed. Если требуется отобразить некоторые результаты по умолчанию, задайте соответствующее текстовое поле DefaultValue.If you want to display some results by default, set the DefaultValue textbox accordingly.

присвоить параметру значение элемента управления CountryNameSet the Parameter Value to the CountryName Control Value

Рис. 8. Присвоение параметру значения элемента управления CountryName (щелкните, чтобы просмотреть изображение с полным размером)Figure 8: Set the Parameter Value to the CountryName Control Value (Click to view full-size image)

Декларативная разметка ObjectDataSource немного отличается от нашего первого примера с использованием ControlParameter вместо стандартного объекта Parameter.The ObjectDataSource's declarative markup differs slightly from our first example, using a ControlParameter instead of the standard Parameter object. У ControlParameter есть дополнительные свойства, позволяющие указать ID веб-элемента управления и значение свойства, которое будет использоваться для параметра (PropertyName).A ControlParameter has additional properties to specify the ID of the Web control and the property value to use for the parameter (PropertyName). Мастер настройки источника данных был достаточно интеллектуальным, чтобы определить, что для текстового поля, скорее всего, потребуется использовать свойство Text для значения параметра.The Configure Data Source wizard was smart enough to determine that, for a TextBox, we'll likely want to use the Text property for the parameter value. Однако если вы хотите использовать другое значение свойства из веб-элемента управления, можно изменить значение PropertyName здесь или щелкнув ссылку "Показывать дополнительные свойства" в мастере.If, however, you want to use a different property value from the Web control you can change the PropertyName value here or by clicking the "Show advanced properties" link in the wizard.

<asp:ObjectDataSource ID="ObjectDataSource2" runat="server"
    SelectMethod="GetSuppliersByCountry" TypeName="SuppliersBLL">
    <SelectParameters>
        <asp:ControlParameter ControlID="CountryName"
            Name="country" PropertyName="Text"
            Type="String" />
    </SelectParameters>
</asp:ObjectDataSource>

При первом посещении страницы в первый раз CountryName TextBox пуст.When visiting the page for the first time the CountryName TextBox is empty. Метод Select ObjectDataSource по-прежнему вызывается GridView, но значение Nothing передается в метод GetSuppliersByCountry(country).The ObjectDataSource's Select method is still invoked by the GridView, but a value of Nothing is passed into the GetSuppliersByCountry(country) method. TableAdapter преобразует Nothing в базу данных NULL значение (DBNull.Value), но запрос, используемый методом GetSuppliersByCountry(country), записывается таким способом, что он не возвращает никаких значений, если для параметра NULL указано значение @CategoryID.The TableAdapter converts the Nothing into a database NULL value (DBNull.Value), but the query used by the GetSuppliersByCountry(country) method is written such that it doesn't return any values when a NULL value is specified for the @CategoryID parameter. Вкратце, поставщики не возвращаются.In short, no suppliers are returned.

Однако после того, как посетитель введет в страну и нажимает кнопку «Показывать поставщиков», чтобы вызвать обратную передачу, повторно запрашивается метод Select ObjectDataSource, передающий значение Text элемента управления TextBox в качестве параметра country.Once the visitor enters in a country, however, and clicks the Show Suppliers button to cause a postback, the ObjectDataSource's Select method is requeried, passing in the TextBox control's Text value as the country parameter.

Отображаются поставщиков из КанадыThose Suppliers from Canada are Shown

Рис. 9. показаны поставщики из Канады (щелкните, чтобы просмотреть изображение с полным размером)Figure 9: Those Suppliers from Canada are Shown (Click to view full-size image)

Отображение всех поставщиков по умолчаниюShowing All Suppliers By Default

Вместо того чтобы показывать ни одного из поставщиков при первом просмотре страницы, может потребоваться сначала отобразить всех поставщиков, чтобы пользователь мог немного очистить вниз по списку, введя название страны в текстовом поле.Rather than show none of the suppliers when first viewing the page we may want to show all suppliers at first, allowing the user to pare down the list by entering a country name in the TextBox. Если текстовое поле пусто, метод GetSuppliersByCountry(country) SuppliersBLL класса передается в Nothing для его входного параметра country .When the TextBox is empty, the SuppliersBLL class's GetSuppliersByCountry(country) method is passed in Nothing for its country input parameter. Это Nothing значение затем передается в метод GetSupplierByCountry(country) DAL, где он преобразуется в базу данных NULL значение параметра @Country в следующем запросе:This Nothing value is then passed down into the DAL's GetSupplierByCountry(country) method, where it's translated to a database NULL value for the @Country parameter in the following query:

SELECT     SupplierID, CompanyName, Address, City, Country, Phone
FROM         Suppliers
WHERE Country = @Country

Выражение Country = NULL всегда возвращает значение false, даже для записей, у которых Country столбец имеет NULL значение. Поэтому записи не возвращаются.The expression Country = NULL always returns False, even for records whose Country column has a NULL value; therefore, no records are returned.

Чтобы получить список всех поставщиков, если текстовое поле Country (страна) пустое, можно дополнить метод GetSuppliersByCountry(country) в BLL, чтобы вызвать метод GetSuppliers(), если параметр Country имеет значение Nothing и вызывать метод GetSuppliersByCountry(country) DAL в противном случае.To return all suppliers when the country TextBox is empty, we can augment the GetSuppliersByCountry(country) method in the BLL to invoke the GetSuppliers() method when its country parameter is Nothing and to call the DAL's GetSuppliersByCountry(country) method otherwise. Это приведет к возврату всех поставщиков, если не указана страна и соответствующее подмножество поставщиков при включении параметра Country.This will have the effect of returning all suppliers when no country is specified and the appropriate subset of suppliers when the country parameter is included.

Измените метод GetSuppliersByCountry(country) в классе SuppliersBLL на следующий:Change the GetSuppliersByCountry(country) method in the SuppliersBLL class to the following:

Public Function GetSuppliersByCountry(country As String) _
    As Northwind.SuppliersDataTable
    If String.IsNullOrEmpty(country) Then
        Return GetSuppliers()
    Else
        Return Adapter.GetSuppliersByCountry(country)
    End If
End Function

После этого изменения DeclarativeParams.aspx страница отображает всех поставщиков при первом посещении (или при пустом текстовом поле CountryName).With this change the DeclarativeParams.aspx page shows all of the suppliers when first visited (or whenever the CountryName TextBox is empty).

все поставщики теперь отображаются по умолчаниюAll Suppliers are Now Shown by Default

Рис. 10. все поставщики теперь отображаются по умолчанию (щелкните, чтобы просмотреть изображение с полным размером)Figure 10: All Suppliers are Now Shown by Default (Click to view full-size image)

СводкаSummary

Чтобы использовать методы с входными параметрами, необходимо указать значения для параметров в коллекции SelectParameters ObjectDataSource.In order to use methods with input parameters, we need to specify the values for the parameters in the ObjectDataSource's SelectParameters collection. Различные типы параметров позволяют получить значение параметра из различных источников.Different types of parameters allow for the parameter value to be obtained from different sources. Тип параметра по умолчанию использует жестко заданное значение, но так же просто (и без строки кода) значения параметров можно получить из строки запроса, переменных сеанса, файлов cookie и даже введенных пользователем значений из веб-элементов управления на странице.The default parameter type uses a hard-coded value, but just as easily (and without a line of code) parameter values can be obtained from the querystring, Session variables, cookies, and even user-entered values from Web controls on the page.

В примерах, рассмотренных в этом учебнике, показано, как использовать значения декларативных параметров.The examples we looked at in this tutorial illustrated how to use declarative parameter values. Однако могут возникнуть ситуации, когда нам нужно использовать недоступный источник параметра, например текущую дату и время, или, если наш сайт использовал членство, идентификатор пользователя посетителя.However, there may be times when we need to use a parameter source that's not available, such as the current date and time, or, if our site was using Membership, the User ID of the visitor. Для таких сценариев мы можем задать значения параметров программным способом до того, как ObjectDataSource вызовет метод базового объекта.For such scenarios we can set the parameter values programmatically prior to the ObjectDataSource invoking its underlying object's method. Мы посмотрим, как это сделать в следующем руководстве.We'll see how to accomplish this in the next tutorial.

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

Об автореAbout the Author

Скотт Митчелл, автор семи книг по ASP/ASP. NET и основатель 4GuysFromRolla.com, работал с веб-технологиями Майкрософт с 1998.Scott Mitchell, author of seven 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 2,0 за 24 часа.His latest book is Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Он доступен по адресу mitchell@4GuysFromRolla.com.He can be reached at mitchell@4GuysFromRolla.com. или через его блог, который можно найти по адресу http://ScottOnWriting.NET.or via his blog, which can be found at http://ScottOnWriting.NET.

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

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