ASP.NET 提供原生 XML 支援,透過 DataSet.ReadXml() 將 XML 檔案載入記憶體資料集,再繫結至清單控制項(RadioButtonList、DropDownList、CheckBoxList、ListBox),實現資料與介面分離、動態選單維護零程式碼修改。
countries.xml
<?xml version="1.0" encoding="utf-8"?>
<countries>
<country>
<text>台灣</text>
<value>TW</value>
</country>
<country>
<text>日本</text>
<value>JP</value>
</country>
<country>
<text>美國</text>
<value>US</value>
</country>
<country>
<text>德國</text>
<value>DE</value>
</country>
</countries>
<%@ Import Namespace="System.Data" %>
<script runat="server">
void Page_Load() {
if (!IsPostBack) {
DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath("~/App_Data/countries.xml"));
rblCountries.DataSource = ds;
rblCountries.DataTextField = "text"; // 顯示文字欄位
rblCountries.DataValueField = "value"; // 實際值欄位
rblCountries.DataBind();
}
}
// 選項變更事件
void rblCountries_SelectedIndexChanged(object sender, EventArgs e) {
lblMessage.Text = "您選擇的國家:" + rblCountries.SelectedItem.Text +
" (值:" + rblCountries.SelectedValue + ")";
}
</script>
<html><body>
<form runat="server">
<h3>請選擇國家:</h3>
<asp:RadioButtonList ID="rblCountries" runat="server"
AutoPostBack="true"
OnSelectedIndexChanged="rblCountries_SelectedIndexChanged"
RepeatDirection="Vertical"
RepeatColumns="2"
RepeatLayout="Table">
</asp:RadioButtonList>
<br /><br />
<asp:Label ID="lblMessage" runat="server" ForeColor="Blue" Font-Bold="true" />
</form>
</body></html>
| 屬性 | 用途 | 範例值 |
|---|---|---|
| DataSource | 資料來源(DataSet、DataTable、DataView、ArrayList 等) | ds |
| DataTextField | 顯示給使用者看的文字欄位名稱 | "text" |
| DataValueField | 表單提交時的實際值欄位名稱 | "value" |
| DataBind() | 執行繫結動作,將資料來源轉換為 ListItem 集合 | - |
| AutoPostBack | 選項變更時自動回傳表單觸發伺服器事件 | true |
| OnSelectedIndexChanged | 選項變更事件處理函數 | "rblCountries_SelectedIndexChanged" |
| RepeatDirection | 排列方向:Vertical(垂直)或 Horizontal(水平) | Vertical |
| RepeatColumns | 欄數(配合 RepeatLayout=Table 使用) | 2 |
| RepeatLayout | Table(表格)、Flow(流式)、OrderedList、UnorderedList | Table |
SelectionMode="Multiple")DisplayMode="Text"/"LinkButton"/"HyperLink")若 XML 結構較複雜,可使用 XmlDataSource 控制項搭配 XPath 查詢:
<?xml version="1.0" encoding="utf-8"?>
<products>
<category id="1" name="電子產品">
<item id="101" name="筆記型電腦" price="30000" />
<item id="102" name="智慧型手機" price="25000" />
</category>
<category id="2" name="家電">
<item id="201" name="冰箱" price="45000" />
<item id="202" name="洗衣機" price="35000" />
</category>
</products>
<asp:XmlDataSource ID="xdsProducts" runat="server"
DataFile="~/App_Data/products.xml"
XPath="products/category[@id='1']/item" />
<asp:DropDownList ID="ddlElectronics" runat="server"
DataSourceID="xdsProducts"
DataTextField="name"
DataValueField="id" />
新增/修改/刪除 XML 節點後重新繫結:
void AddCountry(string text, string value) {
DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath("~/App_Data/countries.xml"));
DataRow newRow = ds.Tables["country"].NewRow();
newRow["text"] = text;
newRow["value"] = value;
ds.Tables["country"].Rows.Add(newRow);
ds.WriteXml(Server.MapPath("~/App_Data/countries.xml")); // 寫回檔案
// 重新繫結
rblCountries.DataSource = ds;
rblCountries.DataBind();
}
| 場景 | 推薦資料來源 | 理由 |
|---|---|---|
| 靜態選單(國家、縣市、分類) | XML 檔案 | 易維護、無需資料庫、版控友善 |
| 頻繁異動、多使用者並存 | 資料庫 | 交易支援、並發控制、查詢彈性 |
| 單一請求內運算產生的選項 | List/Array/DataTable | 效能最佳、無 I/O 開銷 |
| 跨系統整合、API 回應 | XML/JSON 反序列化 | 標準交換格式 |
DataTextField/DataValueField 拼寫是否與 XML 元素名稱完全一致(區分大小寫)!IsPostBack 判斷,避免 PostBack 重複繫結覆蓋使用者選擇XmlReader 串流處理或改用資料庫XML 資料繫結是 ASP.NET Web Forms 快速建構動態選單的利器,配合 XmlDataSource 與 XPath 更能處理複雜階層資料。下一節將介紹 SortedList、Hashtable、ArrayList 等集合類別直接繫結至清單控制項。