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

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

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

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

Введение

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

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

В этом руководстве начнем с демонстрации того, как использовать набор параметров для жестко запрограммированного значения. В частности, мы рассмотрим добавление элемента DetailsView на страницу, на котором отображаются сведения о конкретном продукте, а именно Chef Anton's Gumbo, который имеет ProductID 5. Далее мы посмотрим, как задать значение параметра на основе веб-элемента управления. В частности, мы будем использовать текстовое поле для ввода пользователя в страну, после чего она может нажать кнопку, чтобы просмотреть список поставщиков, находящихся в этой стране.

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

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

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

Рис. 1. Добавление элемента управления ObjectDataSource на страницу (щелкните, чтобы просмотреть изображение с полным размером)

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

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

Рис. 2. выбор класса ProductsBLL (щелкните, чтобы просмотреть изображение с полным размером)

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

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

Рис. 3. выбор метода GetProductByProductID(productID) (щелкните, чтобы просмотреть изображение с полным размером)

Так как выбранный метод включает параметр, в мастере есть еще один экран, где вам будет предложено определить значение, которое будет использоваться для параметра. В списке слева отображаются все параметры для выбранного метода. Для GetProductByProductID(productID) существует только один productID. Справа можно указать значение для выбранного параметра. Раскрывающийся список Источник параметра перечисляет различные возможные источники для значения параметра. Так как нам нужно указать жестко заданное значение 5 для параметра productID, оставьте Источник параметра как нет и введите 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>

Note

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

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

сведения о наборе Gumbo Anton's Chef

Рис. 5. отображаются сведения о наборе Gumbo Chef Anton's (щелкните, чтобы просмотреть изображение с полным размером)

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

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

добавить текстовое поле на страницу с ИДЕНТИФИКАТОРом CountryName

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

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

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

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

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

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

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

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

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

Отображаются поставщиков из Канады

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

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

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

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

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

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

Сводка

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

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

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

Об авторе

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

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

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