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

Скотт Митчелл

Загрузить PDF-файл

В этом руководстве мы покажем, как использовать параметр, заданный в жестко заданном значении, для выбора данных для отображения в элементе управления DetailsView.

Введение

В последнем руководстве мы рассмотрели отображение данных с помощью элементов управления GridView, DetailsView и FormView, привязанных к элементу управления ObjectDataSource, который вызвал GetProducts() метод из ProductsBLL класса . Метод GetProducts() возвращает строго типизированную таблицу DataTable, заполненную всеми записями из таблицы базы данных Products Northwind. Класс ProductsBLL содержит дополнительные методы для возврата только подмножества продуктов : GetProductByProductID(productID), GetProductsByCategoryID(categoryID)и GetProductsBySupplierID(supplierID). Эти три метода ожидают входной параметр, указывающий, как отфильтровать возвращаемые сведения о продукте.

Объект ObjectDataSource можно использовать для вызова методов, которые ожидают входные параметры, но для этого необходимо указать, откуда поступают значения для этих параметров. Значения параметров могут быть жестко заданы или поступать из различных динамических источников, включая значения строки запросов, переменные сеанса, значение свойства веб-элемента управления на странице или другие.

В этом руководстве давайте начнем с того, как использовать параметр, заданный в жестко заданном значении. В частности, мы рассмотрим добавление DetailsView на страницу, на которой отображаются сведения о конкретном продукте, а именно о Gumbo Mix шеф-повара Антона, который имеет ProductID значение 5. Далее мы посмотрим, как задать значение параметра на основе веб-элемента управления. В частности, мы будем использовать Элемент TextBox, чтобы разрешить пользователю вводить данные в стране или регионе, после чего он может нажать кнопку, чтобы просмотреть список поставщиков, которые находятся в этой стране или регионе.

Использование значения параметра Hard-Coded

В первом примере начните с добавления элемента управления DetailsView на страницу DeclarativeParams.aspx в папке BasicReporting . В смарт-теге DetailsView выберите <Новый источник> данных в раскрывающемся списке и добавьте ObjectDataSource.

Добавление ObjectDataSource на страницу

Рис. 1. Добавление ObjectDataSource на страницу (щелкните для просмотра полноразмерного изображения)

При этом автоматически запустится мастер выбора источника данных элемента управления ObjectDataSource. ProductsBLL Выберите класс на первом экране мастера.

Выберите класс ProductsBLL.

Рис. 2. Выбор ProductsBLL класса (щелкните для просмотра полноразмерного изображения)

Так как мы хотим отобразить сведения о конкретном продукте GetProductByProductID(productID) , мы хотим использовать метод .

Выбор метода GetProductByProductID(productID)

Рис. 3. Выбор GetProductByProductID(productID) метода (щелкните для просмотра полноразмерного изображения)

Так как выбранный метод включает параметр, для мастера есть еще один экран, на котором нам предлагается определить значение, которое будет использоваться для параметра. В списке слева отображаются все параметры выбранного метода. Для GetProductByProductID(productID) есть только один productID. Справа можно указать значение для выбранного параметра. В раскрывающемся списке источник параметров перечисляются различные возможные источники для значения параметра. Так как мы хотим указать жестко закодированное значение 5 для productID параметра, оставьте для параметра Источник параметров значение None и введите 5 в текстовое поле DefaultValue.

Для параметра productID будет использоваться значение параметра Hard-Coded 5.

Рис. 4. Для параметра будет использоваться productID значение параметра Hard-Coded 5 (щелкните для просмотра полноразмерного изображения)

После завершения работы мастера настройки источника данных декларативная разметка элемента управления ObjectDataSource включает Parameter объект в SelectParameters коллекцию для каждого из входных параметров, ожидаемых методом, определенным в свойстве SelectMethod . Так как метод, который мы используем в этом примере, ожидает только один входной параметр , parameterIDздесь есть только одна запись. Коллекция SelectParameters может содержать любой класс, производный Parameter от класса в System.Web.UI.WebControls пространстве имен. Для жестко закодированных значений параметров используется базовый Parameter класс, но для других параметров источника параметров используется производный Parameter класс. При необходимости можно также создать собственные настраиваемые типы параметров.

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

Примечание

Если вы выполняете на своем компьютере, декларативная разметка, которую вы видите на этом этапе, может включать значения для InsertMethodсвойств , UpdateMethodи DeleteMethod , а также DeleteParameters. Мастер выбора источника данных ObjectDataSource автоматически задает методы из ProductBLL , используемые для вставки, обновления и удаления, поэтому, если вы не удалили их явным образом, они будут включены в разметку выше.

При посещении этой страницы веб-элемент управления данными вызывает метод ObjectDataSource Select , который вызывает ProductsBLL метод класса GetProductByProductID(productID) , используя жестко закодированное значение 5 для productID входного параметра. Метод возвращает строго типизированный ProductDataTable объект, содержащий одну строку со сведениями о Gumbo Mix Chef Антона (продукт с ProductID 5).

Отображается информация о гамбо-миксе шеф-повара Антона

Рис. 5. Отображаются сведения о наборе Gumbo шеф-повара Антона (щелкните для просмотра полноразмерного изображения)

Установка значения параметра в значение свойства веб-элемента управления

Значения параметров ObjectDataSource также можно задать на основе значения веб-элемента управления на странице. Чтобы проиллюстрировать это, давайте создадим GridView со списком всех поставщиков, расположенных в стране, указанной пользователем. Для этого необходимо добавить элемент TextBox на страницу, на которой пользователь может ввести название страны. Задайте для свойства этого элемента управления ID TextBox значение CountryName. Кроме того, добавьте веб-элемент управления Кнопка.

Добавление элемента TextBox на страницу с идентификатором CountryName

Рис. 6. Добавление элемента TextBox на страницу с IDCountryName помощью (щелкните для просмотра полноразмерного изображения)

Затем добавьте GridView на страницу и в смарт-теге выберите для добавления новый объект ObjectDataSource. Так как мы хотим отобразить сведения о поставщике, SuppliersBLL выберите класс на первом экране мастера. На втором экране выберите GetSuppliersByCountry(country) метод .

Выбор метода GetSuppliersByCountry(country)

Рис. 7. Выбор GetSuppliersByCountry(country) метода (щелкните для просмотра полноразмерного изображения)

GetSuppliersByCountry(country) Так как метод имеет входной параметр, мастер снова включает окончательный экран для выбора значения параметра. На этот раз присвойте источнику параметров значение Control. В раскрывающемся списке ControlID будут заполнены имена элементов управления на странице; выберите элемент CountryName управления из списка. При первом посещении CountryName страницы элемент TextBox будет пустым, поэтому результаты не возвращаются и ничего не отображается. Если вы хотите отобразить некоторые результаты по умолчанию, задайте соответствующее текстовое поле DefaultValue.

Присвойте параметру значение элемента управления CountryName

Рис. 8. Задайте для параметра значение CountryName управляющего значения (щелкните для просмотра полноразмерного изображения)

Декларативная разметка ObjectDataSource немного отличается от первого примера, используя ControlParameter вместо стандартного Parameter объекта. Имеет ControlParameter дополнительные свойства для указания ID значения веб-элемента управления и значения свойства, используемого для параметра (PropertyName). Мастер настройки источника данных достаточно умен, чтобы определить, что для TextBox, скорее всего, потребуется использовать Text свойство для значения параметра. Однако если вы хотите использовать значение свойства, отличное от веб-элемента управления, вы можете изменить PropertyName его здесь или щелкнув ссылку "Показать дополнительные свойства" в мастере.

<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 пуст. Метод ObjectDataSource Select по-прежнему вызывается GridView, но в GetSuppliersByCountry(country) метод передается значение Nothing . TableAdapter преобразует Nothing в значение базы данных NULL (DBNull.Value), но запрос, используемый методом GetSuppliersByCountry(country) , записывается таким образом, что он не возвращает значения при NULL указании @CategoryID значения для параметра . Короче говоря, поставщики не возвращаются.

Однако когда посетитель войдет в страну или регион и нажимает кнопку Показать поставщиков, чтобы вызвать обратную передачу, метод ObjectDataSource Select повторно отправляется, передавая значение элемента управления Text TextBox в качестве country параметра.

Показаны поставщики из Канады

Рис. 9. Показаны поставщики из Канады (щелкните для просмотра полноразмерного изображения)

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

Вместо того, чтобы показать ни одного из поставщиков при первом просмотре страницы, мы можем сначала показать всех поставщиков, чтобы позволить пользователю проанализировать список, введя название страны в TextBox. Если элемент TextBox пуст, SuppliersBLL метод класса GetSuppliersByCountry(country) передается для Nothing входного country параметра. Затем это Nothing значение передается в метод DAL GetSupplierByCountry(country) , где оно преобразуется в значение базы данных NULL для @Country параметра в следующем запросе:

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

Выражение Country = NULL всегда возвращает значение False, даже для записей, столбец которых Country имеет NULL значение, поэтому записи не возвращаются.

Чтобы вернуть все поставщики, если поле country TextBox пусто, мы можем дополнить GetSuppliersByCountry(country) метод в BLL, чтобы вызвать GetSuppliers() метод, если параметр country равен Nothing , и вызвать метод DAL в GetSuppliersByCountry(country) противном случае. Это приведет к возврату всех поставщиков, если не указана ни одна страна, и соответствующее подмножество поставщиков при включении параметра country.

Измените GetSuppliersByCountry(country) метод в SuppliersBLL классе следующим образом:

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 TextBox).

Теперь все поставщики отображаются по умолчанию

Рис. 10. Теперь все поставщики отображаются по умолчанию (щелкните для просмотра полноразмерного изображения)

Сводка

Чтобы использовать методы с входными параметрами, необходимо указать значения параметров в коллекции ObjectDataSource SelectParameters . Различные типы параметров позволяют получать значение параметра из разных источников. Тип параметра по умолчанию использует жестко закодированное значение, но так же легко (и без строки кода) значения параметров можно получить из строки запросов, переменных сеанса, файлов cookie и даже введенных пользователем значений из веб-элементов управления на странице.

Примеры, которые мы рассмотрели в этом руководстве, проиллюстрировали использование декларативных значений параметров. Однако в некоторых случаях нам может потребоваться использовать источник параметров, который недоступен, например текущую дату и время, или, если наш сайт использовал членство, идентификатор пользователя посетителя. Для таких сценариев можно задать значения параметров программным способом до вызова метода объекта ObjectDataSource. Мы посмотрим, как это сделать в следующем руководстве.

Счастливое программирование!

Об авторе

Скотт Митчелл (Scott Mitchell), автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с Веб-технологиями Майкрософт с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Sams Teach Yourself ASP.NET 2.0 в 24 часа. Его можно связать по адресу mitchell@4GuysFromRolla.com. или через его блог, который можно найти по адресу http://ScottOnWriting.NET.

Отдельная благодарность

Эта серия учебников была проверена многими полезными рецензентами. Ведущим рецензентом этого руководства был Хилтон Гисеноу. Хотите ознакомиться с моими предстоящими статьями MSDN? Если да, опустите мне строку в mitchell@4GuysFromRolla.com.