資料繫結控件的 `
<asp:DataList ID="dlstCon" runat="server" RepeatDirection="Horizontal" RepeatLayout="Flow">
<ItemTemplate>
<li>
<a href='<%# "ShowList.aspx?ExhibitionID=" + Eval("ExhibitionID") %>'
title='<%# GetTooltip(Eval("Title"), Eval("TitleValue")) %>'
>
<%# Eval("Title") %>
</a>
</li>
</ItemTemplate>
</asp:DataList>
public partial class ExhibitionList : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// 模擬資料來源
var data = new[]
{
new { ExhibitionID = 1, Title = "台北國際書展", TitleValue = "ZH-TW" },
new { ExhibitionID = 2, Title = "Tokyo Book Fair", TitleValue = "JA-JP" },
new { ExhibitionID = 3, Title = "Seoul Book Fair", TitleValue = "" } // 無語言版本
};
dlstCon.DataSource = data;
dlstCon.DataBind();
}
}
///
/// 供前台 <%# %> 呼叫:組合工具提示文字
///
protected string GetTooltip(object titleObj, object titleValueObj)
{
string title = titleObj?.ToString() ?? "";
string value = titleValueObj?.ToString() ?? "";
if (!string.IsNullOrEmpty(value) && value != "Null")
return $"{title} [{value}]";
return title;
}
}
| 語法 | 用途 | 範例 |
|---|---|---|
| `Eval("ColumnName")` | 單向繫結:讀取資料項屬性/欄位 | `<%# Eval("Title") %>` |
| `Bind("ColumnName")` | 雙向繫結:編輯模式回寫 (GridView/DetailsView) | `<%# Bind("Price") %>` |
| `<%# Method(args) %>` | 呼叫後台方法,回傳字串/物件直接輸出 | `<%# FormatPrice(Eval("Price")) %>` |
| `<%# Expression %>` | 任意 C# 運算式 (字串串接、三元運算子、方法鏈) | `<%# (bool)Eval("IsActive") ? "啟用" : "停用" %>` |
| `Container.DataItem` | 取得完整資料項物件 (需轉型) | `<%# ((MyEntity)Container.DataItem).FullName %>` |
// 後台
protected MyDto GetDetail(int id) => Service.Get(id);
// 前台
<%# GetDetail((int)Eval("Id")).Description %>
<%# (bool)Eval("HasDiscount") ? $"<span class='badge'>{Eval("DiscountPct")}% OFF</span>" : "" %>
<%# ((DateTime)Eval("CreateTime")).ToString("yyyy/MM/dd HH:mm") %>
<%# string.Format("{0:C0}", Eval("Price")) %>
<%# (Eval("OptionalField") ?? "預設值").ToString() %>
<%# Eval("OptionalField")?.ToString() ?? "預設值" %>
`<%# Method(...) %>` 是 ASP.NET WebForms **分離關注點** 的關鍵技術:前台負責呈現結構,後台負責格式化邏輯。善用此機制,配合 `Eval`/`Bind`、條件運算式、格式化字串,即可在保持標記乾淨的同時實現複雜的動態 UI 生成。大量資料場景建議在資料存取層預先計算好顯示欄位,減少繫結期運算。