代码之家  ›  专栏  ›  技术社区  ›  peacedog

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

  •  4
  • peacedog  · 技术社区  · 16 年前

    这是一个ASP.NET 2.0 Web应用程序。项目模板如下所示,仅供参考:

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

    在codebehind中使用这个:

    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中的数据

    我似乎无法像在数据列表或网格视图中那样获取数据,而且我似乎无法在谷歌上找到任何其他东西,也无法快速利用这个工具来做我想做的事情。我唯一能看到的获取数据的方法就是使用regex去获取数据(因为一个人得到了他想要的东西)。他接受了一切。我是个男人,不是吗?我不是吗?).

    我是在正确的轨道上(不是在寻找特定的regex来做这个;伪造这可能是一个后续问题);还是我错过了什么?


    在这种情况下中继器是石头设置的,所以我不能切换到更优雅的东西。有一次我做了一些类似于艾莉森周建议使用数据列表的事情,但是已经有一段时间了(2年多),我完全忘记了这样做。是的,谈谈忽视一些显而易见的事情。…

    所以我按照艾莉森的建议做了,而且效果很好。我不认为视图状态在这里是一个问题,即使这个中继器可以得到几十行。我真的不能用这种方式来回答这个问题,而不是用这个来代替(但这对我来说似乎是一个很好的解决方案)。显然,后者并不是视图状态的足迹,但我没有足够的经验来说明,在我面前没有一个极端的例子的情况下,一种方法何时比另一种方法更可取。艾莉森,一个问题:为什么文字而不是标签?

    欧米切利,我试图避免返回数据库。因为相对于其他的开发领域,我还是有点环保,我承认我不一定很好地理解有多少数据库访问是“恰到好处的”。这里不会有性能问题(我知道应用程序的负载足以知道这一点),但我想我是出于习惯而尝试避免的,因为我的老板倾向于在可能的情况下强调更少的旅行。

    5 回复  |  直到 11 年前
        1
  •  6
  •   Răzvan Flavius Panda    11 年前

    从我的头顶上,你可以尝试这样的方法:

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

    这将添加到您的视图状态,但它使您很容易找到控件。

        2
  •  2
  •   ern    16 年前

    因为您使用的是表格数据,所以我建议您使用GridView控件。然后你就可以访问各个单元了。

    否则,可以将field1和field4的td设置为 runat="server" 并给他们ID。然后在代码隐藏中,访问 InnerText 每个TD的属性。

        3
  •  0
  •   Dillie-O    16 年前

    如果您可以在生成过程中增加一点开销,那么可以使用datalist并使用datakeys属性,它将保存您需要的数据字段。

    您还可以在每个表单元格中使用标签,并能够使用e.item.findcontrol(“labelid”)引用项。

        4
  •  0
  •   Community CDub    7 年前

    <%databinder.eval(…)%>机制不是“严格”意义上的数据绑定。在模板的特定位置放置文本是一种单向技术。

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

    1. 从源数据中获取
    2. 用不同的机制填充中继器

    请注意,转发器不会在回发之间保存数据源,您不能要求它稍后提供数据。

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

    对于第二种方法,一种常见的技术是使用文本控件。见 Alison Zhou 关于如何做的示例。我个人通常更喜欢在OnitemDatabound中填充文本控件。

        5
  •  0
  •   Community CDub    7 年前

    @peacedog :

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

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

    因此,通过cookie、viewstate、隐藏字段或任何其他方法向浏览器发送数据实际上比从数据库中再次读取数据“更糟”。还有一些安全隐患需要牢记(一个“邪恶”的用户能伪造从浏览器返回的数据吗?如果他们这样做会有关系吗?).

    但通常情况下,它不会对性能产生任何影响。这就是为什么你应该为你的特定问题做一些更自然的事情,只为它担心。 如果 性能开始成为现实问题。

    祝你好运!

    推荐文章