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