ASP.NET - 使用/不使用Eval获取Repeater ItemTemplate中的对象

时间:2010-11-13 05:54:07

标签: c# asp.net data-binding repeater

我是Repeater和DataBinding的新手,我需要帮助才能使用它。

在PageLoad中,我有

var photos = from p in MyDataContext.Photos
             select new {
               p,
               Url = p.GetImageUrl()
             };
repeater1.DataSource = photos;
repeater1.DataBind();

在Repeater控件中,我有

<ItemTemplate>
  <% Photo p = (Photo) Eval("p"); %> <!-- Apparently I can't do this -->
  ...
  <asp:TextBox runat="server" ID="txtTime" Text='<%= p.Time == null ? "" : ((DateTime)p.Time).ToString("dd/MM/yyyy HH:mm:ss") %>' />
  ...
</ItemTemplate>

但这是错误的。

我需要的是在ItemTemplate中获取Photo对象,以便我可以使用它(例如,在上面的ItemTemplate的第二行中显示时间)。甚至可以在中继器中执行此操作吗?

有人能指出我正确的方向吗?

提前谢谢!

3 个答案:

答案 0 :(得分:1)

尝试这样的事情在onDatabound事件中

if (e.Item.ItemType = ListItemType.Item)
{
  photo p = (photo)e.DataItem;
  Textbox txtTime = (Textbox)e.Item.FindControl("txtTime");

  txtTime.text = (p.Time == null ? "" : ((DateTime)p.Time).ToString("dd/MM/yyyy HH:mm:ss"));
}

编辑 -

抱歉,我没有在那里看到额外的Url。我看起来你可能要创建一个小类或结构。

有关黑客解决方法,请参阅此Stackoverflow link

Paul Suart在该帖子中的帖子提出了一个有效的观点。

答案 1 :(得分:0)

您是否尝试过:

<%# Eval("p") %>

而不是

<% Photo p = (Photo) Eval("p"); %>

答案 2 :(得分:0)

我使用另一种方法。在我的“注册”中,导入对象类:

<%@ Import Namespace="Test.Test.TO" %>

有了这个,就有可能使用您的对象...

接下来,我创建了一个想要在我的代码隐藏全局变量中绑定的相同类型的对象...

public Test test;

在我的Repeater的ItemTemplete内:

<span style="display: none;"> <%# test = (Test)Container.DataItem %> </span>

现在,您可以使用对象的所有属性,包括ToString来设置区域性的格式...

对不起,我的英语。