Tin tức

Sử dụng CascadingDropDown với cơ sở dữ liệu

08/04/2013

Tổng quan:

Điều khiển CascadingDropdown trong AJAX Control Toolkit mở rộng điều khiển DropDownList do vậy cho phép cách tải DropDownList với các giá trị liên quan trong DropDownList khác. (Ví dụ, một danh sách cung cấp một danh sách các tiểu bang Hoa Kỳ, và danh sách tiếp theo sau đó được lấp đầy với các thành phố lớn trong tiểu bang đó.) Để cho tiện làm việc, một dịch vụ web đặc biệt phải được tạo ra.

Các bước:

Trước hết, một nguồn dữ liệu được yêu cầu. Ví dụ mẫu này sử dụng cơ sở dữ liệu AdventureWorks và Microsoft SQL Server 2005 Express Edition. Cơ sở dữ liệu là một phần tùy chọn khi cài đặt Visual Studio (bao gồm cả thể hiện bản) và cũng có thể download tại địa chỉ http://go.microsoft.com/fwlink/?LinkId=64064 . Cơ sở dữ liệu AdventureWorks là một phần của cơ sở dữ liệu mẫu SQL Server 2005 (download tại http://www.microsoft.com/downloads/details.aspx?FamilyID=e719ecf7-9f46-4312-af89-6ad8702e4e6e&DisplayLang=en). Cách dễ nhất để thiết lập cơ sở dữ liệu lên là sử dụng Microsoft SQL Server Management Studio Express (http://www.microsoft.com/downloads/details.aspx?FamilyID=c243a5ae-4bd1-4e3d-94b8-5a0f62bf7796&DisplayLang=en) và attach tập tin cơ sở dữ liệu AdventureWorks.mdf. 

Đối với mẫu này, chúng ta sử dụng Instance của SQL Server 2005 Express Edition được gọi là SQLExpress và đặt trên cùng một máy với máy chủ web, điều này cũng là thiết lập mặc định. Nếu thiết lập của bạn khác nhau, bạn phải thay đổi phù hớp với các thông tin kết nối cho các cơ sở dữ liệu.
Để kích hoạt các chức năng của ASP.NET AJAX và Control Toolkit, Điều khiển ScriptManager phải được đặt bất cứ nơi nào trên trang (nhưng bên trong thẻ <form>):
Trong bước tiếp theo, hai điều khiển DropDownList được yêu cầu thêm vào. Trong ví dụ này, chúng ta sử dụng thông tin các nhà cung cấp (vendor) và thông tin liên hệ (contract) từ cơ sở dữ liệu AdventureWorks, do đó chúng ta tạo ra một danh sách các nhà cung cấp có sẵn và một cho các địa chỉ liên lạc có sẵn:

<div>
 Vendor: <asp:DropDownList ID="VendorsList" runat="server"/><br />
 Contacts: <asp:DropDownList ID="ContactsList" runat="server"/><br />
</div>

Sau đó, hai điều khiển mở rộng CascadingDropdown phải được thêm vào trang. Một điền vào danh sách đầu tiên (nhà cung cấp), và một người khác lấp đầy thứ hai danh sách (liên lạc). Các thuộc tính sau đây phải được thiết lập:
• ServicePath: URL của web service cung cấp danh sách mục tin
• ServiceMethod: Web method cung cấp danh sách mục tin
• TargetControlID: ID của danh sách dropdown 
• Category: Danh mục thông tin được gửi tới phương thức web khi được gọi
• PromptText: Văn bản được hiển thị khi tải danh sách dữ liệu bất đồng bộ từ máy chủ
• ParentControlID: (Tùy chọn) Danh sách dropdown cha kích hoạt tải danh sách hiện hành

Tùy thuộc vào ngôn ngữ lập trình được sử dụng, tên của các dịch vụ web thay đổi theo yêu cầu, nhưng tất cả các giá trị thuộc tính khác đều giống nhau. Đây là thẻ CascadingDropdown cho danh sách thả xuống đầu tiên:
<ajaxToolkit:CascadingDropDown ID="ccd1" runat="server"
 ServicePath="CascadingDropdown1.cs.asmx" ServiceMethod="GetVendors"
 TargetControlID="VendorsList" Category="Vendor"
 PromptText="Select Vendor" />

Điều khiển mở rộng cho danh sách thứ hai cần gán các thuộc tính ParentControlID để lựa chọn một mục tin trong danh sách các nhà cung cấp kích hoạt tải các phần tử liên quan trong danh sách liên lạc
<ajaxToolkit:CascadingDropDown ID="ccd2" runat="server"
 ServicePath="CascadingDropdown1.cs.asmx" ServiceMethod="GetContactsForVendor"
 TargetControlID="ContactsList" ParentControlID="VendorsList"
 Category="Contact"
 PromptText="Select Contact" />

Công việc thực tế sau đó được thực hiện trong các dịch vụ web, được thiết lập như sau. Lưu ý rằng thuộc tính [ScriptService] được sử dụng, nếu không ASP.NET AJAX không thể tạo ra các proxy JavaScript để truy cập các phương thức web từ mã kịch bản phía máy khách.

<%@ WebService Language="C#" Class="CascadingDropdown1" %>
using System.Web.Script.Services;
using AjaxControlToolkit;
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Data.SqlClient;
[ScriptService]
public class CascadingDropdown1 : System.Web.Services.WebService
{
 // ...
}

Cú pháp của các phương thức web được gọi bởi CascadingDropDown như sau:

public CascadingDropDownNameValue[] MethodNameHere(string knownCategoryValues,
 string category)

Vì vậy, giá trị trả về phải là một mảng các loại CascadingDropDownNameValue được xác định bởi Control Toolkit. Phương thức GetVendors () là khá dễ dàng để thực hiện: mã kết nối với cơ sở dữ liệu AdventureWorks và truy vấn 25 nhà cung cấp đầu tiên. Tham số đầu tiên trong hàm tạo CascadingDropDownNameValue là tiêu đề của mục tin danh sách, thứ hai giá trị của nó (giá trị thuộc tính trong thẻ <option> của HTML). Đây là mã:

[WebMethod]
public CascadingDropDownNameValue[] GetVendors(string knownCategoryValues, string category)
{
 SqlConnection conn = new SqlConnection("server=(local)\\SQLEXPRESS;
 Integrated Security=true; Initial Catalog=AdventureWorks");
 conn.Open();
 SqlCommand comm = new SqlCommand("SELECT TOP 25 VendorID, Name
 FROM Purchasing.Vendor",conn);
 SqlDataReader dr = comm.ExecuteReader();
 List<CascadingDropDownNameValue> l = new List<CascadingDropDownNameValue>();
 while (dr.Read())
 {
 l.Add(new CascadingDropDownNameValue(dr["Name"].ToString(),
 dr["VendorID"].ToString()));
 }
 conn.Close();
 return l.ToArray();
}

Nhận liên lạc liên quan cho một nhà cung cấp (tên phương thức: GetContactsForVendor ()) là một chút phức tạp. Trước hết, các nhà cung cấp đã được chọn trong danh sách thả xuống đầu tiên phải được xác định. Bộ Control Toolkit xác định một phương thức trợ giúp cho nhiệm vụ đó: Phương thức ParseKnownCategoryValuesString ()trả về một StringDictionaryelement với dữ liệu thả xuống:

[WebMethod]
public CascadingDropDownNameValue[] GetContactsForVendor(string knownCategoryValues,
 string category)
{
 int VendorID;
 CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues);

Vì lý do bảo mật, dữ liệu này phải được kiểm tra đầu tiên. Do vậy nếu một mục  Vendor (Bởi vì thuộc tính Category của  CascadingDropDown  đầu tiên được gán là  "Vendor"), Mã ID của  vendor  được chọn có thể nhận :

if (!kv.ContainsKey("Vendor") || !Int32.TryParse(kv["Vendor"],out VendorID))
{
throw new ArgumentException("Couldn't find vendor.");
};


Phần còn lại của phương thức này thuận tiện để tiếp tục. ID của nhà cung cấp được sử dụng như một tham số cho một truy vấn SQL để lấy tất cả các địa chỉ liên lạc liên quan cho nhà cung cấp đó. Một lần nữa, phương thức trả về một mảng của CascadingDropDownNameValue.
SqlConnection conn = new SqlConnection("server=(local)\\SQLEXPRESS;
 Integrated Security=true; Initial Catalog=AdventureWorks");
 conn.Open();
 SqlCommand comm = 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);
 SqlDataReader dr = comm.ExecuteReader();
 List<CascadingDropDownNameValue> l = new List<CascadingDropDownNameValue>();
 while (dr.Read())
 {
 l.Add(new CascadingDropDownNameValue(
 dr["FirstName"].ToString() + " " + dr["LastName"].ToString(),
 dr["ContactID"].ToString()));
 }
 conn.Close();
 return l.ToArray();
}
 
Tải các trang ASP.NET, sau một thời gian ngắn, các nhà cung cấp danh sách được làm đầy với 25 mục. Chọn một mục và chú ý cách danh sách thả xuống thứ hai được làm đầy với dữ liệu.
 
Danh sách đầu tiên được điền tự động 
 
Danh sách thứ hai được điền theo lựa chọn của danh sách đầu tiên 

Công ty Cổ phần Eastern Sun Việt Nam