2009-01-01 16 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

保持简单。

你写的(哪怕是重复的)的更多的代码,更多的错误可能潜入英寸

我更喜欢第一种方法,因为你不需要的事件处理程序,并保留所有的格式中一个单独的课程,如果不止一次使用。

相关问题