[Web] 減少使用DataBinder.Eval?

  剛開始寫網頁程式,對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,甚致未來的維護困難,所以還是”視情況抓藥”就好.

 

參考資料 :

ASP.NET 資料繫結概觀

DataBinder.Eval 方法

Web Form 資料繫結的的資訊