我有一个自定义对象(一个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}&s={1}&st={2}", packageId, _streamId, (int)_phase);
}
2)我可以挂钩到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()需要在aspx中的控件上使用runat =“server”,这有一个令人讨厌的编码ID的习惯,并且通常会搞乱HTML。< / p>
我很想听到那些提出处理这类问题的好方法的人。
答案 0 :(得分:1)
保持简单。
您编写的代码越多(即使它是重复的),错误可能会越多。
我更喜欢第一种方法,因为您不需要事件处理程序,如果多次使用,请将所有格式保存在单独的类中。
答案 1 :(得分:1)
在这种情况下,你所做的就是操纵一些HTML,所以我会使用第一种方法。第二种方法适用于您需要检查数据绑定项并对响应中的服务器控件进行更改(例如绑定嵌套列表)。
另请注意,对DataBinder.Eval()的调用很昂贵 - 它使用反射。使用显式转换可以获得更好的性能:
MakePackageSelectionUrl(((System.Data.DataRowView)Container.DataItem)["PackageId"])
供参考:http://msdn.microsoft.com/en-us/library/ms998549.aspx。请参阅有关最小化对DataBinder.Eval的调用的部分。