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

时间:2020-03-05 18:50:53  来源:igfitidea点击:

这是一个ASP.Net 2.0 Web应用程序。 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上提出其他任何建议,也无法迅速利用此功能来完成我想要的工作。我看到的获取数据的唯一方法是使用正则表达式进行获取(因为一个人拿走了他想要的东西。他拿走了所有东西。而我是一个男人,不是吗?我不是吗?)。

我是在正确的轨道上(不是在寻找要使用的正则表达式吗;伪造的可能是后续问题;))还是我缺少某些东西?

在这种情况下,直放站是固定在石头上的,所以我不能切换到更优雅的东西。曾几何时,我做过类似于Alison Zhou建议的使用DataLists的操作,但是已经有一段时间了(超过2年),我完全忘了这样做。是的,谈论忽略明显的事情。 。 。

所以我按照艾莉森的建议做了,而且效果很好。我不认为viewstate在这里不是问题,即使此转发器可以获取数十行。我真的不能说这个问题,而不是使用替代方法(但这对我来说似乎是一个很好的解决方案)。显然,后者占用的视图空间较少,但是我没有足够的经验来说明何时没有一种极端的示例可以使一种方法优于另一种方法。艾莉森(Alison),一个问题:为什么是文字而不是标签?

Euro Micelli,我试图避免返回数据库。由于相对于其他开发人员而言,我还是有点绿色,我承认我并不一定掌握多少行数据库"正确"。这里不会有性能问题(我知道应用程序的负载足以知道这一点),但是我想我正试图避免出于习惯,因为我的老板倾向于尽可能减少旅行次数。

解决方案

回答

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

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

回答

如果我们可以负担更多的开销,请使用DataList并使用DataKeys属性,该属性将保存我们需要的数据字段。

我们还可以在每个表格单元格中使用标签,并能够通过e.Item.FindControl(" LabelID")引用项目。

回答

我们可以尝试以下操作:

<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>

然后,在后面的代码中,可以按以下方式访问每个文字控件:

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,但是使查找控件变得容易。

回答

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

如果需要取回数据,则必须执行以下任一操作:

  • 从源数据中获取
  • 使用其他机制填充中继器

请注意,Repeater不会在回发之间保存数据源,我们不能只是要求它以后提供数据。

第一种方法通常更易于使用。不要以为从源重新获取数据太昂贵,除非我们通过测量证明了这一点。通常很快。这种技术的最大问题是源数据是否可以在调用之间进行更改。

对于第二种方法,一种常见的技术是使用文字控件。有关如何执行此操作的示例,请参见Alison Zhou的帖子。我通常个人更喜欢在OnItemDataBound内部填充Literal控件

回答

@peacedog:

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

数据库往返的诀窍:显然它们不是免费的,但是Web服务器往往与数据库非常"接近"(快速,低延迟连接),而用户则可能"遥远"(缓慢,高延迟)联系)。

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

但是通常情况下,它对性能没有任何影响。这就是为什么我们应该针对特定问题进行更自然的处理,并且仅在性能开始成为现实问题时才担心它。

祝你好运!