Поделиться через


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

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

Скачать в формате PDF

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

Введение

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

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

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

Использование жестко закодированного значения параметра

В первом примере сначала добавьте элемент управления 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.

Значение жестко закодированного параметра 5 будет использоваться для параметра productID

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

После завершения мастера настройки источника данных декларативная разметка элемента управления 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 объект, содержащий одну строку с информацией о миксе Chef Антона в Gumbo Mix (продукт с ProductID 5).

Отображаются сведения о миксе Гамбо Шеф-повара Антона

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

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

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

Добавление текстового поля на страницу с идентификатором CountryName

Рис. 6. Добавление текстового поля на страницу с ID CountryName помощью (щелкните, чтобы просмотреть изображение полного размера)

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

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

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

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

Задайте для параметра значение элемента управления CountryName

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

Декларативная разметка ObjectDataSource немного отличается от первого примера, используя controlParameter вместо стандартного Parameter объекта. A 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 посещении страницы текстовое поле пусто. Метод ObjectDataSource Select по-прежнему вызывается GridView, но значение Nothing передается в GetSuppliersByCountry(country) метод. 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 значение; поэтому не возвращаются записи.

Чтобы вернуть всех поставщиков, если страна TextBox пуста, мы можем расширить GetSuppliersByCountry(country) метод в BLL, чтобы вызвать GetSuppliers() метод, если его параметр страны является Nothing и вызвать метод DAL GetSuppliersByCountry(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 поле пусто).

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

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

Итоги

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

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

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

Об авторе

Скотт Митчелл, автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с технологиями Microsoft Web с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Сэмс Учит себя ASP.NET 2.0 в 24 часах. Он может быть достигнут в mitchell@4GuysFromRolla.com. или через его блог, который можно найти на http://ScottOnWriting.NET.

Особое спасибо

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