Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Элемент управления CascadingDropDown в AJAX Control Toolkit расширяет элемент управления DropDownList, так что изменения в одном DropDownList загружают соответствующие значения в другом DropDownList. Чтобы это работало, необходимо создать специальную веб-службу.
Обзор
Элемент управления CascadingDropDown в AJAX Control Toolkit расширяет элемент управления DropDownList, так что изменения в одном DropDownList загружают соответствующие значения в другом DropDownList. (Например, один список содержит список штатов США, а следующий список затем заполняется крупными городами в этом штате.) Чтобы это работало, необходимо создать специальную веб-службу.
Шаги
Во-первых, требуется источник данных. В этом примере используется база данных AdventureWorks и Microsoft SQL Server 2005 Express Edition. База данных является необязательной частью установки Visual Studio (включая экспресс-выпуск), а также доступна как отдельная загрузка в разделе https://go.microsoft.com/fwlink/?LinkId=64064. База данных AdventureWorks входит в состав примеров и образцов баз данных SQL Server 2005 (скачать по адресу https://www.microsoft.com/download/details.aspx?id=10679). Самый простой способ настроить базу данных — использовать Microsoft SQL Server Management Studio (/sql/ssms/download-sql-server-management-studio-ssms) и подключить AdventureWorks.mdf файл базы данных.
В этом примере предполагается, что экземпляр SQL Server 2005 Express Edition вызывается SQLEXPRESS и находится на том же компьютере, что и веб-сервер. Это также настройка по умолчанию. Если настройка отличается, необходимо адаптировать сведения о подключении для базы данных.
Чтобы активировать функциональные возможности ASP.NET AJAX и набора средств управления, элемент ScriptManager управления должен быть помещен в любое место на странице (но в элементе<form>):
<asp:ScriptManager ID="asm" runat="server" />
На следующем шаге требуются два элемента управления DropDownList. В этом примере мы используем поставщик и контактные данные из AdventureWorks, поэтому мы создадим один список для доступных поставщиков и один для доступных контактов:
<div>
Vendor: <asp:DropDownList ID="VendorsList" runat="server"/><br />
Contacts: <asp:DropDownList ID="ContactsList" runat="server"/><br />
</div>
Затем на страницу необходимо добавить два расширителя CascadingDropDown. Один заполняет первый (поставщик) список, а другой заполняет второй (контакты) список. Необходимо задать следующие атрибуты:
-
ServicePath: URL-адрес веб-службы, предоставляющий записи списка -
ServiceMethod: веб-метод доставки записей списка -
TargetControlID: идентификатор раскрывающегося списка -
Category: сведения о категории, отправляемые в веб-метод при вызове -
PromptText: текст, отображаемый при асинхронной загрузке данных списка с сервера -
ParentControlID: (необязательно) родительский раскрывающийся список, который активирует загрузку текущего списка
В зависимости от используемого языка программирования имя веб-службы в вопросе изменяется, но все остальные значения атрибутов одинаковы. Ниже приведен элемент CascadingDropDown для первого раскрывающегося списка:
<ajaxToolkit:CascadingDropDown ID="ccd1" runat="server"
ServicePath="CascadingDropdown1.vb.asmx" ServiceMethod="GetVendors"
TargetControlID="VendorsList" Category="Vendor"
PromptText="Select Vendor" />
Расширяющие элементы управления для второго списка должны задать ParentControlID атрибут, чтобы выбор записи в списке поставщиков активировал загрузку связанных элементов в списке контактов.
<ajaxToolkit:CascadingDropDown ID="ccd2" runat="server"
ServicePath="CascadingDropdown1.vb.asmx" ServiceMethod="GetContactsForVendor"
TargetControlID="ContactsList" ParentControlID="VendorsList"
Category="Contact"
PromptText="Select Contact" />
Затем фактические действия выполняются в веб-службе, которая настроена следующим образом. Обратите внимание, что [ScriptService] атрибут используется, в противном случае ASP.NET AJAX не может создать прокси-сервер JavaScript для доступа к веб-методам из клиентского кода скрипта.
<%@ WebService Language="VB" Class="CascadingDropdown1" %>
Imports System.Web.Script.Services
Imports AjaxControlToolkit
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Collections.Generic
Imports System.Collections.Specialized
Imports System.Data.SqlClient
<ScriptService()> _
Public Class CascadingDropdown1
Inherits System.Web.Services.WebService
' ...
End Class
Подпись веб-методов, вызываемых CascadingDropDown, выглядит следующим образом:
Public Function MethodNameHere(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
Поэтому возвращаемое значение должно быть массивом типов CascadingDropDownNameValue , определенных набором средств управления. Этот GetVendors() метод довольно прост в реализации: код подключается к базе данных AdventureWorks и запрашивает первых 25 поставщиков. Первый параметр в конструкторе CascadingDropDownNameValue — заголовок записи списка, второй — значение (атрибут значения в элементе HTML<option>). Ниже приведен код:
<WebMethod()> _
Public Function GetVendors(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
Dim conn As New SqlConnection("server=(local)\SQLEXPRESS; Integrated Security=true; Initial Catalog=AdventureWorks")
conn.Open()
Dim comm As New SqlCommand( _
"SELECT TOP 25 VendorID, Name FROM Purchasing.Vendor", conn)
Dim dr As SqlDataReader = comm.ExecuteReader()
Dim l As New List(Of CascadingDropDownNameValue)
While (dr.Read())
l.Add(New CascadingDropDownNameValue(dr("Name").ToString(),dr("VendorID").ToString()))
End While
conn.Close()
Return l.ToArray()
End Function
Получение связанных контактов для поставщика (имя метода: GetContactsForVendor()) - это немного сложная задача. Во-первых, поставщик, выбранный в первом раскрывающемся списке, должен быть определен. Набор средств управления определяет вспомогательный метод для этой задачи: метод ParseKnownCategoryValuesString() возвращает элемент с данными для раскрывающегося списка StringDictionary.
<WebMethod()> _
Public Function GetContactsForVendor(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
Dim VendorID As Integer
CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues)
По соображениям безопасности эти данные должны быть проверены сначала. Таким образом, если имеется запись Vendor (так как Category свойство первого элемента CascadingDropDown имеет "Vendor"значение ), идентификатор выбранного поставщика может быть получен:
If Not kv.ContainsKey("Vendor") Or Not Int32.TryParse(kv("Vendor"),VendorID) Then
Throw New ArgumentException("Couldn't find vendor.")
End If
Остальная часть метода довольно проста, следовательно. Идентификатор поставщика используется в качестве параметра для SQL-запроса, который получает все связанные контакты для этого поставщика. Еще раз метод возвращает массив типа CascadingDropDownNameValue.
Dim conn As New SqlConnection("server=(local)\SQLEXPRESS; Integrated Security=true; Initial Catalog=AdventureWorks")
conn.Open()
Dim comm As New SqlCommand("SELECT Person.Contact.ContactID, FirstName, LastName FROM Person.Contact,Purchasing.VendorContact WHERE VendorID=@VendorID AND Person.Contact.ContactID=Purchasing.VendorContact.ContactID",conn)
comm.Parameters.AddWithValue("@VendorID", VendorID)
Dim dr As SqlDataReader = comm.ExecuteReader()
Dim l As New List(Of CascadingDropDownNameValue)
While (dr.Read())
l.Add(New CascadingDropDownNameValue(dr("FirstName").ToString() & " " & dr("LastName").ToString(),dr("ContactID").ToString()))
End While
conn.Close()
Return l.ToArray()
End Function
Загрузите страницу ASP.NET и через некоторое время список поставщиков заполняется 25 записями. Выберите одну запись и обратите внимание на то, как второй раскрывающийся список заполняется данными.
Первый список заполняется автоматически (щелкните, чтобы просмотреть изображение полного размера)
Второй список заполняется в соответствии с выбранным в первом списке (щелкните, чтобы просмотреть изображение полного размера)