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

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

Загрузить 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 параметра, оставьте для параметра Источник параметра значение Нет и введите 5 в текстовое поле DefaultValue.

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

Рис. 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 шеф-повара Антона (продукт с ProductID 5).

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

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

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

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

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

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

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

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

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

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

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

Вместо того чтобы показывать ни одного из поставщиков при первом просмотре страницы, мы можем сначала показать всех поставщиков, чтобы пользователь мог просмотреть список, введя название страны или региона в Текстовом поле. Если элемент TextBox пуст, SuppliersBLL метод класса GetSuppliersByCountry(country) передается в null значение для входного country параметра. Затем это null значение передается в метод 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() метод, если его параметр country равен null , и вызвать метод DAL GetSuppliersByCountry(country) в противном случае. Это приведет к возврату всех поставщиков, если не указана страна, и соответствующее подмножество поставщиков, если включен параметр country.

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

public Northwind.SuppliersDataTable GetSuppliersByCountry(string country)
{
    if (string.IsNullOrEmpty(country))
        return GetSuppliers();
    else
        return Adapter.GetSuppliersByCountry(country);
}

При этом изменении на 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.