Декларативные параметры (C#)
В этом руководстве мы проиллюстрируем использование параметра с жестко заданным значением для выбора данных, отображаемых в элементе управления 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
параметра, оставьте для параметра Источник параметра значение Нет и введите 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 шеф-повара Антона (продукт с ProductID
5).
Рис. 5. Отображаются сведения о наборе Gumbo шеф-повара Антона (щелкните для просмотра полноразмерного изображения)
Задание значения параметра значением Свойства веб-элемента управления
Значения параметров ObjectDataSource также можно задать на основе значения веб-элемента управления на странице. Чтобы проиллюстрировать это, давайте создадим элемент GridView, который перечисляет всех поставщиков, расположенных в стране или регионе, указанных пользователем. Для этого сначала добавьте элемент TextBox на страницу, на которой пользователь может ввести название страны или страны. Присвойте свойству ID
этого элемента управления TextBox значение CountryName
. Кроме того, добавьте веб-элемент управления Button.
Рис. 6. Добавление элемента TextBox на страницу с ID
CountryName
помощью (щелкните для просмотра полноразмерного изображения)
Затем добавьте GridView на страницу и в смарт-теге выберите добавить новый ОбъектDataSource. Так как мы хотим отобразить сведения о поставщике, 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)
метод передается значение 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.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по