以编程方式访问ASP.NET 2.0中继器中的数据

时间:2008-09-10 17:03:10

标签: asp.net repeater data-access

这是一个ASP.Net 2.0网络应用程序。 Item模板如下所示,供参考:

<ItemTemplate>
  <tr>
    <td class="class1" align=center><a href='url'><img src="img.gif"></a></td>
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field1") %></td>
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field2") %></td>
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field3") %></td>
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field4") %></td>
  </tr>
</ItemTemplate>

在代码隐藏中使用它:

foreach (RepeaterItem item in rptrFollowupSummary.Items)
{
    string val = ((DataBoundLiteralControl)item.Controls[0]).Text;
    Trace.Write(val);
}

我制作了这个:

<tr>
  <td class="class1" align=center><a href='url'><img src="img.gif"></a></td>
  <td class="class1">23</td>
  <td class="class1">1/1/2000</td>
  <td class="class1">-2</td>
  <td class="class1">11</td>
</tr>

我需要的是Field1和Field4的数据

我似乎无法按照我说的DataList或GridView的方式获取数据,而且我似乎无法在Google上提出任何其他内容或快速利用这个来做我想要的事情。我能看到获取数据的唯一方法就是使用正则表达式去获取它(因为一个人拿走了他想要的东西。他把它全部拿走了。我是个男人,不是我吗?Aren我呢?)

我是否在正确的轨道上(没有寻找特定的正则表达式来执行此操作;伪造可能是一个后续问题;)),还是我错过了什么?


在这种情况下,中继器是一成不变的,所以我不能切换到更优雅的东西。曾几何时我做了类似于Alison Zhou建议使用DataLists的东西,但是已经有一段时间了(2年多),我完全忘记了这样做。 Yeesh,谈论忽视一些明显的东西。 。

所以我按照艾莉森的建议做了,它运作正常。我不认为viewstate在这里是一个问题,即使这个转发器可以获得几十行。我不能真正地说这个问题,如果这样做而不是使用相反(但这对我来说似乎是一个很好的解决方案)。显然,后者不是一个观点足迹,但我没有经验足以说明一种方法在我面前没有一个极端的例子时可能更适合另一种方法。艾莉森,一个问题:为什么文字而不是标签?

Euro Micelli,我试图避免返回数据库。由于我相对于其他开发领域仍然有点绿色,我承认我并不一定非常了解有多少数据库出行“恰到好处”。这里不存在性能问题(我知道应用程序的负载足以知道这一点),但我想我试图避免它出于习惯,因为我的老板倾向于在可能的情况下强调更少的旅行。

5 个答案:

答案 0 :(得分:6)

在我的头顶,您可以尝试这样的事情:

<ItemTemplate>
  <tr>
    <td "class1"><asp:Literal ID="litField1" runat="server" Text='<%# Bind("Field1") %>'/></td>
    <td "class1"><asp:Literal ID="litField2" runat="server" Text='<%# Bind("Field2") %>'/></td>
    <td "class1"><asp:Literal ID="litField3" runat="server" Text='<%# Bind("Field3") %>'/></td>
    <td "class1"><asp:Literal ID="litField4" runat="server" Text='<%# Bind("Field4") %>'/></td>
  </tr>
</ItemTemplate>

然后,在您的代码中,您可以按如下方式访问每个Literal控件:

foreach (RepeaterItem item in rptrFollowupSummary.Items)
{   
    Literal lit1 = (Literal)item.FindControl("litField1");
    string value1 = lit1.Text;
    Literal lit4 = (Literal)item.FindControl("litField4");
    string value4 = lit4.Text;
}

这将添加到您的ViewState,但它可以轻松找到您的控件。

答案 1 :(得分:2)

由于您正在使用表格数据,我建议使用GridView控件。然后,您将能够访问单个单元格。

否则,您可以将Field1和Field4的td设置为runat="server"并为其指定ID。然后在代码隐藏中,访问每个td的InnerText属性。

答案 2 :(得分:0)

如果您能够在生成中承担更多的开销,请转到DataList并使用DataKeys属性,这将保存您需要的数据字段。

您还可以在每个表格单元格中使用标签,并且能够使用e.Item.FindControl(“LabelID”)引用项目。

答案 3 :(得分:0)

&lt;%#DataBinder.Eval(...)%&gt;机制不是“严格”意义上的数据绑定。将文本放在模板中的特定位置是一种单向技术。

如果您需要取回数据,则必须:

  1. 从源数据中获取
  2. 使用不同的机制填充转发器
  3. 请注意,Repeater不会在回发之间保存DataSource,您不能要求它稍后为您提供数据。

    第一种方法通常更容易使用。不要认为从源头重新获取数据太昂贵,除非你通过测量证明自己的数据;它通常很快。这种技术的最大问题是源数据是否可以在不同的调用之间发生变化。

    对于第二种方法,常用的技术是使用Literal控件。有关如何操作的示例,请参阅Alison Zhou的帖子。我通常个人更喜欢填充OnItemDataBound里面的Literal控件

答案 4 :(得分:0)

@peacedog

正确;艾莉森的方法是完全可以接受的。

数据库往返的技巧:它们显然不是免费的,但是Web服务器往往与数据库非常“接近”(快速,低延迟连接),而您的用户可能“远”(慢,高延迟连接)。

因此,通过cookie,ViewState,隐藏字段或任何其他方法向/从浏览器发送数据实际上可能比从数据库中再次读取数据更“糟糕”。还要记住安全隐患(“邪恶”用户可以伪造从浏览器返回的数据吗?如果他们这样做会有意义吗?)。

但通常它在性能方面没有任何差别。这就是为什么你应该为你的特定问题做更自然的工作,只关心如果性能开始成为现实问题。

祝你好运!