首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET Repeater 資料格式化:三元運算子與後端方法回傳

     編輯:ASP.NET 基礎

在 `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>

要點:

  • `Eval("price")` 回傳 `object`,需轉型比較(`Convert.ToDecimal`、`Convert.ToInt32` 等)。
  • 結果必須是**字串**,直接輸出 HTML 片段或純文字。
  • 邏輯過長時可換行、縮排,但建議控制在單行可讀範圍內。

方法二:呼叫後端受保護/公用方法(適用於複雜邏輯、重複使用)

後端程式碼


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`集中處理編碼邏輯

進階技巧

1. 多欄位聯合判斷


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")) %>

2. 使用 `ItemDataBound` 事件(最靈活、完全分離視圖邏輯)


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" : "";
    }
}

總結建議

  1. **單一欄位、簡單條件** → 內嵌三元運算子,快速完成。
  2. **複雜格式化、需重用、含 HTML 結構** → 後端 `protected` 方法,集中管理、易測試。
  3. **需存取控制項屬性、綁定多個控制項、複雜 UI 互動** → `ItemDataBound` 事件,完全掌控。
  4. **永遠記得**:輸出使用者輸入內容時,務必 `HttpUtility.HtmlEncode` 防 XSS(除非確定是安全的 HTML 片段)。

善用這兩種技巧,能讓 Repeater 等繫結控制項的模板保持乾淨,邏輯集中在後端,維護性大幅提升。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved