需呈現「分類 → 項目清單」的兩層結構,資料來源為 Dictionary<int, List<User>>,Key 為分類 ID,Value 為該分類下的使用者清單。使用巢狀 Repeater 實現無分頁、純渲染的高效能列表。
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<%# ((KeyValuePair<int, List<User>>)Container.DataItem).Key %> <br />
<asp:Repeater ID="Repeater2" runat="server"
DataSource='<%# ((KeyValuePair<int, List<User>>)Container.DataItem).Value %>'>
<ItemTemplate>
<%# ((User)Container.DataItem).Id %> - <%# ((User)Container.DataItem).Name %><br />
</ItemTemplate>
</asp:Repeater>
<hr />
</ItemTemplate>
</asp:Repeater>
public partial class Temp : System.Web.UI.Page
{
private readonly Dictionary<int, List<User>> _dict = new Dictionary<int, List<User>>();
protected void Page_Load(object sender, EventArgs e)
{
_dict.Add(1, new List<User> { new User { Id = 1, Name = "aa" }, new User { Id = 2, Name = "bb" } });
_dict.Add(2, new List<User> { new User { Id = 3, Name = "cc" }, new User { Id = 4, Name = "dd" } });
Repeater1.DataSource = _dict;
Repeater1.DataBind();
}
}
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
Dictionary,Container.DataItem 型別為 KeyValuePair<TKey, TValue>。DataSource 使用內嵌運算式 `<%# ... %>` 取得 .Value(即 List<User>),自動實作 IEnumerable 介面,滿足資料來源需求。((KeyValuePair<...>)Container.DataItem)` 明確轉型,避免晚期繫結效能損耗。「Repeater 使用的是無效資料來源。有效資料來源必須實作 IListSource 或 IEnumerable」
| 錯誤情況 | 說明 | 修正 |
|---|---|---|
| 直接綁定單一物件(非集合) | 如 User、string、int | 包裝為 new List<User> { user } 或 new[] { user } |
綁定 DataTable / DataSet 未指定 DefaultView | 舊版需 dt.DefaultView | 改用 dt.AsEnumerable() 或確認已實作 IListSource |
巢狀 Repeater DataSource 運算式語法錯誤 | 缺少單引號或轉型錯誤 | 參考本文範例:DataSource='<%# ((KeyValuePair<...>)Container.DataItem).Value %>' |
SortedDictionary 或 List<KeyValuePair>。ViewStateMode="Disabled" 並搭配輸出快取。