在 GridView 模板列中,常需將數據庫存儲的代碼值(如 0/1、狀態碼)轉換為用戶友好的文本(如「否/是」、「正常/禁用」)。本文對比三種常見實現方式,從模型封裝到內聯表達式,按優雅度遞增排序。
在實體/模型類中定義通用轉換方法:
public function item($items, $name) {
$returnValue = '';
foreach ($items as $n => $item) {
if (isset($this->$name)) {
if ($n == $this->$name) {
$returnValue = $item;
}
}
}
return $returnValue;
}
視圖中調用:
array(
'name' => 'isPass',
'value' => '$data->item(array(\'1\'=>\'是\',\'0\'=>\'否\'), \'isProcess\')',
'filter' => array('1'=>'是','0'=>'否')
)
優點:邏輯集中、可單元測試、多視圖復用。缺點:需修改模型類,PHP 語法示例需適配 C#。
直接在 GridView 列定義中使用 Eval 配合三元表達式:
'value' => '$data->ispass == "1" ? "是" : "否"'
或 ASP.NET WebForms 語法:
<%# Eval("IsPass").ToString() == "1" ? "是" : "否" %>
優點:零後台代碼,就地可見。缺點:邏輯分散,複雜映射時可讀性下降。
後台處理 RowDataBound 事件,靈活操作任意控件:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
DataRowView drv = (DataRowView)e.Row.DataItem;
string val = drv["IsPass"].ToString();
Label lbl = (Label)e.Row.FindControl("lblStatus");
lbl.Text = val == "1" ? "是" : "否";
// 還可設置顏色、圖標等豐富 UI
lbl.ForeColor = val == "1" ? System.Drawing.Color.Green : System.Drawing.Color.Red;
}
}
優點:支持複雜 UI 邏輯(顏色、圖標、控件顯隱)。缺點:代碼分離,需 FindControl,性能略低。
| 場景 | 推薦方式 |
|---|---|
| 簡單二值/少量枚舉轉換,追求簡潔 | 方式二(內聯三元) |
| 轉換邏輯復用率高,或遵循分層架構 | 方式一(模型封裝) |
| 需根據值動態調整樣式、圖標、控件狀態 | 方式三 |