剛開始寫網頁程式,對DataBinding很沒有概念,都是用DataBinder.Eval一招打遍天下,但真的只有這招可以用,是否還有其它更好的用法?
剛開始寫網頁程式,對DataBinding很沒有概念,都是用DataBinder.Eval一招打遍天下,但真的只有這招可以用,是否還有其它更好的用法?
Page.DataBind是一個不錯用的方法,主要是將資料來源繫結到伺服器控制項及它的全部子控制項.用程式碼舉例來說.
HTML :
<asp:Label id="label1" runat="server">
<%# GetTestText() %>
</asp:Label>
Server :
private void Page_Load(object sender, System.EventArgs e)
{
Page.DataBind();
}
public string GetTestText()
{
return "test";
}
如此在網頁顯示時,Lable就會從GetTestText的這個Function去取得值並顯示,所以網頁上的Lable就會顯示test,而這個Function我是設為public,如果保護層級設太低,就會出現錯誤訊息,所以必需設為public.
編譯錯誤
描述: 資源編譯無法完成 (錯誤發生於服務要求)。請檢閱下列的特定錯誤詳細資料,並視情況修改您的原始程式碼。
編譯器錯誤訊息: CS0122: 因為保護層級,無法存取 'WebTest.WebForm1.GetTestText()'
這個方式看來很方便,但它的壞處呢?基本上是建議”盡量避免”去使用Page.DataBind,因為呼叫Page.DataBind會去使用Page-Level的Method,所有網頁上有用到Page-Level 的控制項DataBind都會觸發,所以為了避免這情況產生,建議盡量避免使用.
再來就是<%# DataBinder.Eval(Container.DataItem,”fieldName”) %>,這招可以說是一招打遍,不管來源是什麼,像是DataReader還是DataTable,用它就可以繫結了,但這麼多用的情況下,所需付出的就是效能資源代價,因為它是晚期繫結才進行來源評估,如果我們已經知道來源資料,其實有其它建議的做法,使用明確轉型會換得較好的效能:
資料來源 : DataReader
<%# ((DbDataRecord)(Container.DataItem)).GetString(0) %>
<%# ((DbDataRecord)(Container.DataItem)).GetInt(1) %>
<%# ((DbDataRecord)(Container.DataItem))[“FieldName1”] %>
*因為DbDataRecord,記得Import namespace
<%@ Import namespace=”System.Data.Common” %>
不然就要用
<%# ((System.Data.Common .DbDataRecord)(Container.DataItem))[“FieldName1”] %>
資料來源 : DataTable
<%# ((DataRowView)(Container.DataItem))[“FieldName1”] %>
或在ItemDataBound的時候再去填入資料:
Protected void Repeater_ItemDataBound(Object sender, RepeaterItemEventArgs e)
{
DataRowView drv=(DataRowView)e.Item.DataItem;
if (drv!=null)
{
Response.Write(string.Format(“<td>{0}</td>”,drv[“FieldName1”]));
}
}
從以上內容來看,”方便”都是用”效能”換來的,但也不見得走火入魔般的,全部用Response.Write的方式來產生內容,有些情況可能根本感覺不出差別(尤其資料量少的時候),可是卻花了大量的工在Coding,甚致未來的維護困難,所以還是”視情況抓藥”就好.
參考資料 :