前兩篇分析了單向與雙向繫結的內部機制,本篇分享實務上常見的特殊欄位名稱問題。
資料庫欄位名稱若包含 (、)、[、] 等字元,在 <%# Eval("欄位名") %> 中直接使用會報錯。以「電壓(V)」為例:
<%# Eval("電壓(V)") %>
執行時錯誤:DataBinding: "System.Data.DataRowView" 不包含名為 "電壓" 的屬性。
嘗試加上方括號 <%# Eval("[電壓(V)]") %> 仍失敗:電壓(V 既不是表 DataTable1 的 DataColumn 也不是 DataRelation。
GridView 內部並非使用 DataBinder.Eval,而是有自己的取值邏輯,因此能正確處理特殊字元。
DataBinder.Eval 內部透過 DataBinder.GetPropertyValue 解析運算式,其剖析器將 ( ) [ ] 視為運算子而非欄位名稱一部分,導致解析錯誤。
<%# Eval("[電壓(V)]") %> 在某些版本可行,但不穩定。DataBinder 或使用 DataRowView["欄位名"] 直接存取。深入理解繫結剖析器行為,才能在遇到特殊命名時靈活因應,避免運行時驚喜。