在 `Repeater`、`GridView`、`ListView` 等資料繫結控制項的模板中,常需根據資料值動態決定顯示內容(如:價格超過門檻顯示標記、特定商品名替換連結)。本文介紹兩種最常用、最簡潔的格式化技巧。
<asp:Repeater ID="rptProducts" runat="server">
<ItemTemplate>
<tr>
<td><%# Eval("productName") %></td>
<td>
<%#
Convert.ToDecimal(Eval("price")) > 3600
? "<a href='#'>高價標記</a>"
: Eval("price").ToString()
%>
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
要點:
public partial class ProductList : System.Web.UI.Page
{
// 必須是 protected 或 public,模板才能存取
protected string FormatProductName(string name)
{
if (string.IsNullOrEmpty(name)) return "";
if (name == "Iphone4s")
return "<a href='detail.aspx?id=5'>iPhone 5</a>"; // 替換為新款連結
return name; // 其他維持原樣
}
protected string FormatPrice(decimal price, string currency = "NT$")
{
if (price > 10000)
return $"<span class='text-danger'>{currency}{price:N0}</span>";
return $"{currency}{price:N0}";
}
}
<ItemTemplate>
<td><%# FormatProductName(Eval("productName").ToString()) %></td>
<td><%# FormatPrice(Convert.ToDecimal(Eval("price"))) %></td>
</ItemTemplate>
| 比較項目 | 三元運算子 | 後端方法 |
|---|---|---|
| 適用複雜度 | 簡單條件、單一欄位 | 複雜邏輯、多欄位關聯、需重複使用 |
| 可讀性 | 內嵌標記中,過長難閱讀 | 程式碼後置,結構清晰 |
| 除錯 | 難以中斷點、Watch | 可正常中斷點除錯 |
| 效能 | 極佳(內嵌運算) | 極佳(方法呼叫開銷極小) |
| HTML 編碼安全 | 需自行 `HttpUtility.HtmlEncode` | 集中處理編碼邏輯 |
protected string GetStatus(object statusObj, object qtyObj)
{
int qty = Convert.ToInt32(qtyObj);
string status = statusObj?.ToString();
if (status == "OutOfStock" || qty == 0) return "<span class='badge bg-danger'>缺貨</span>";
if (qty < 10) return "<span class='badge bg-warning'>庫存不足</span>";
return "<span class='badge bg-success'>有庫存</span>";
}
<%# GetStatus(Eval("status"), Eval("quantity")) %>
protected void rpt_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
var row = (DataRowView)e.Item.DataItem;
var lbl = (Label)e.Item.FindControl("lblPrice");
decimal price = Convert.ToDecimal(row["price"]);
lbl.Text = price > 3600 ? "高價" : price.ToString("N0");
lbl.CssClass = price > 3600 ? "text-danger" : "";
}
}
善用這兩種技巧,能讓 Repeater 等繫結控制項的模板保持乾淨,邏輯集中在後端,維護性大幅提升。