У меня есть контроллер Repeater, привязанный к пользовательскому объекту (запрос EntitySpaces), и я заметил, что есть несколько способов условно отформатировать отображаемые значения.
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 () в выделенном фрагменте кода требует runat = "server" для элемента управления в aspx, который имеет неприятную привычку кодировать идентификаторы и вообще портить HTML. 1009 *
Мне очень хотелось бы услышать от любого, кто придумал хороший подход для решения подобных проблем.