Декларативные параметры (VB)
В этом руководстве показано, как использовать параметр, заданный в жестко закодированном значении, чтобы выбрать данные для отображения в элементе управления 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.
Рис. 1. Добавление ObjectDataSource на страницу (щелкните, чтобы просмотреть изображение полного размера)
При этом автоматически запускается мастер выбора источника данных элемента управления ObjectDataSource. ProductsBLL
Выберите класс на первом экране мастера.
Рис. 2. Выберите ProductsBLL
класс (щелкните, чтобы просмотреть изображение полного размера)
Так как мы хотим отобразить сведения о конкретном продукте, который мы хотим использовать этот GetProductByProductID(productID)
метод.
Рис. 3. Выберите GetProductByProductID(productID)
метод (щелкните, чтобы просмотреть изображение полного размера)
Так как выбранный метод включает параметр, есть еще один экран для мастера, где мы просим определить значение, которое будет использоваться для параметра. В списке слева показаны все параметры выбранного метода. Для GetProductByProductID(productID)
этого есть только один productID
. Справа можно указать значение выбранного параметра. Раскрывающийся список источника параметров перечисляет различные возможные источники для значения параметра. Так как мы хотим указать жестко закодированное значение 5 для productID
параметра, оставьте источник параметров равным None и введите 5 в текстовое поле DefaultValue.
Рис. 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.
Рис. 6. Добавление текстового поля на страницу с ID
CountryName
помощью (щелкните, чтобы просмотреть изображение полного размера)
Затем добавьте GridView на страницу и в смарт-теге выберите добавить новый ObjectDataSource. Так как мы хотим отобразить сведения о поставщике, выберите SuppliersBLL
класс на первом экране мастера. На втором экране выберите GetSuppliersByCountry(country)
метод.
Рис. 7. Выбор GetSuppliersByCountry(country)
метода (щелкните, чтобы просмотреть изображение полного размера)
GetSuppliersByCountry(country)
Так как метод имеет входной параметр, мастер снова включает окончательный экран для выбора значения параметра. На этот раз задайте для источника параметров значение Control. Будет заполнен раскрывающийся список ControlID именами элементов управления на странице; CountryName
Выберите элемент управления из списка. При первом посещении CountryName
страницы textBox будет пустым, поэтому результаты не возвращаются и ничего не отображаются. Если вы хотите отобразить некоторые результаты по умолчанию, задайте текстовое поле DefaultValue соответствующим образом.
Рис. 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.