2009-01-01 52 views
1

我有一個綁定到自定義對象(EntitySpaces查詢)的Repeater控件,並且已經注意到有兩種方法可以有條件地格式化顯示的值。在數據綁定控件中應用條件格式時的最佳做法?

1)從我的aspx我可以在後臺代碼調用的方法和通過該結合的值,並用它來驅動任何條件邏輯:

 <a class="star" href="<%#MakePackageSelectionUrl((int)DataBinder.Eval(Container.DataItem, "PackageId"))%>"> 

and then in the code-dehind: 

    protected string MakePackageSelectionUrl(int packageId) 
    { 
       return string.Format("/Packages/NoAjax/ToggleStar.aspx?p={0}&amp;s={1}&amp;st={2}", packageId, _streamId, (int)_phase); 
    } 

2)I可以掛接到ItemDataBound事件,檢索e.Item.DataItem強制轉換爲DataRowView的,然後發瘋:

protected void PackageList_ItemDataBound(Object sender, RepeaterItemEventArgs e) 
    { 
     if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem) { return; } 

     DataRowView details = (DataRowView)e.Item.DataItem; 

     EncodePackageName(e, details); 
     EncodeStatusName(e); 
     DisplayStarImage(e, details); 
    } 

    private static void EncodePackageName(RepeaterItemEventArgs e, DataRowView dr) 
    { 
     HtmlAnchor p = (HtmlAnchor)e.Item.FindControl("packageLink"); 
     if (p != null) 
     { 
      p.HRef = string.Format("/Packages/View.aspx?p={0}", dr["packageId"]); 
      p.InnerHtml = HttpUtility.HtmlEncode((string)dr["packageName"]); 
     } 
    } 

我也注意到,在使用e.Item.FindControl()代碼後需要對控制RUNAT =「服務器」在aspx中有一個令人討厭的編碼id習慣,並且通常搞亂了HTML。

我很想聽到任何人提出了處理這類問題的好方法。

回答

1

在這種情況下,你所做的只是操縱一些HTML,所以我會使用第一種方法。第二種方法適用於需要檢查正在綁定數據的項目並對響應中的服務器控件進行更改(例如綁定嵌套列表)。

還要注意對DataBinder.Eval()的調用很昂貴 - 它使用反射。你會得到更好的表現,使用像這樣的明確鑄造:

MakePackageSelectionUrl(((System.Data.DataRowView)Container.DataItem)["PackageId"]) 

供參考:http://msdn.microsoft.com/en-us/library/ms998549.aspx。請參閱最小化對DataBinder.Eval的調用。

1

保持簡單。

你寫的(哪怕是重複的)的更多的代碼,更多的錯誤可能潛入英寸

我更喜歡第一種方法,因爲你不需要的事件處理程序,並保留所有的格式中一個單獨的課程,如果不止一次使用。

相關問題