小研究了一下如何用Ajax.dll實現上一個例子,很沮喪,因爲使用人家的方法,更簡單,代碼更少,而且僅僅是它的皮毛而已。所以,如果做項目要用到Ajax,建議研究一下框架,比如說Ext。它的類庫和文檔相當豐富,簡單易上手。
好吧,我把實現過程列出來。首先我們需要一個Ajax.dll文件,這個自己去找吧!放到項目中,並添加好引用。首先,你需要一個類,隨意命名爲“AjaxMethod.cs”代碼如下:
namespace Test.AjaxTest
{
/// <summary>
/// AjaxMethod 的摘要說明。
/// </summary>
public class AjaxMethod
{
public AjaxMethod() {}
//數據庫查詢操作
[Ajax.AjaxMethod(Ajax.HttpSessionStateRequirement.Read)]
public DataSet GetList(string id)
{
string sql = "select CityName,CityCode from City where [ID]=" + id;
return SelectData(sql); //調用下面的方法
}
//
private DataSet SelectData(string sql)
{
//數據庫鏈接定義:
//Web.config中<configuration><appSettings></appSettings></configuration>
//中添加定義:<add key="ConnectionString" value="data source=localhost;
// initial catalog=helpdesk1; user id=sa; password=sa; "></add>
string cs = System.Configuration.ConfigurationSettings .AppSettings["ConnectionString"];
//或者直接這樣定義
//string cs = "Server=(local);UID=sa;PWD=sa;Database=HelpDesk1";
SqlDataAdapter sda = new SqlDataAdapter(sql,cs);
DataSet ds = new DataSet();
sda.Fill(ds);
return ds;
}
}
}
接下來是你要實現效果的頁面a.aspx,<body>部分很簡單:
<body>
<form id="Form1" method="post" runat="server">
<select id="AList" οnchange="GetBList()">
<option value="0">A</option>
<option value="1">B</option>
<option value="2">C</option>
</select>
<select id="BList"></select>
</form>
</body> 當頁面觸發onchange事件,便進入了GetBList()方法,下面是該頁面完整的js: <script language="javascript">
function GetBList() {
//調用數據庫操作方法
var av = document.getElementById("AList").value;
// 調用AjaxMethod類的方法,至於這裏有兩個參數,猜想是一個委託,// 將GetList執行結果DataSet傳遞給SetBList方法,隱藏了AjaxMethod.GetList(av, SetBList);
}
function SetBList(response) {
if(response != null) { var ds = response.value; // 返回集
// 這裏很有特色,開始我感覺出錯了,怎麼js的語法規則跟c#一樣啊// 可見Ajax.dll裏面的正則應該寫的暴強!不過有一點讓人感覺不爽// 我在測試時,將ds.Tables[0].Rows.lenght寫成了ds.Tables[0].Rows.Count // js會找不到對象的錯誤。
// 如此等於,我們還是要習慣它的規則,畢竟不完全是c#,它只是定義了一種跟c#
//非常接近的語法規則而已
if(ds != null && typeof(ds) == "object" && ds.Tables != null) { alert(ds.Tables[0].Rows.length);
for(var i=0;i<ds.Tables[0].Rows.length;i++) { var option = document.createElement("OPTION");
option.value = ds.Tables[0].Rows[i].CityCode;
option.text = ds.Tables[0].Rows[i].CityName;
document.Form1.BList.options.add(option);
}
}
}
}
</script>
如此例子便結束了,很多繁複的操作都封裝了。我們學到的只是如何用,僅此而已,不過在我們趕項目的時候,確實能帶來很多的方便。
補充:按照上面的方式配置,會得到一個異常,就是無法識別AjaxMethod類的異常,我們需要在頁面的後臺cs文件中,添加定義:Ajax.Utility.RegisterTypeForAjax(typeof(完整命名空間.AjaxMethod));
除了這裏要添加註冊定義之外,我們還需要在web.config中添加:
<httpHandlers>
<add verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory, Ajax" />
</httpHandlers>
延伸:我們完全可以將AjaxMethod寫成一個公共Page,將調用業務層代碼的方法添加進來。如此,便可以不用在那裏面定義數據庫鏈接了——我們要得到的僅僅是一個DataTable,而不必關心用什麼樣的方式得到它。這樣的設計與項目框架的結合將更緊密。