Программный доступ к данным в повторителе ASP.NET 2.0

StackOverflow https://stackoverflow.com/questions/54708

  •  09-06-2019
  •  | 
  •  

Вопрос

Это веб-приложение ASP.Net 2.0.Для справки шаблон элемента выглядит следующим образом:

<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 или быстро использовать это, чтобы сделать то, что я хочу.Единственный способ получить данные, который я вижу, — это использовать регулярное выражение, чтобы получить их (потому что человек берет то, что хочет.Он берет все это.И я мужчина, не так ли?Не так ли?).

Я на правильном пути (не ищу конкретное регулярное выражение для этого;подделка, это может быть дополнительный вопрос;)), или я что-то упускаю?


Репитер в данном случае высечен на камне, поэтому я не могу переключиться на что-то более элегантное.Когда-то я сделал что-то похожее на то, что предложила Элисон Чжоу, используя DataLists, но прошло некоторое время (2+ года), и я просто совершенно забыл об этом.Да, поговорим о том, чтобы не заметить что-то очевидное...

Итак, я сделал, как предложила Элисон, и все работает нормально.Я не думаю, что состояние представления здесь является проблемой, даже несмотря на то, что этот повторитель может получить десятки строк.Я не могу ответить на вопрос, стоит ли делать это таким образом, а не использовать вместо этого (но в противном случае мне кажется, что это хорошее решение).Очевидно, что последнее меньше влияет на состояние представления, но у меня недостаточно опыта, чтобы сказать, когда один подход может быть предпочтительнее другого, не имея перед собой экстремального примера.Элисон, один вопрос:почему литералы, а не метки?

Евро Мичелли, я пытался избежать обратной поездки в базу данных.Поскольку я все еще немного неопытен по сравнению с остальным миром разработчиков, я признаю, что не обязательно хорошо понимаю, сколько обращений к базе данных является «правильным».Здесь не было бы проблем с производительностью (я достаточно знаю нагрузку приложения, чтобы знать это), но я полагаю, что пытался избежать этого по привычке, поскольку мой начальник склонен делать упор на меньшее количество поездок, где это возможно.

Это было полезно?

Решение

На мой взгляд, вы можете попробовать что-то вроде этого:

<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, но облегчит поиск элементов управления.

Другие советы

Поскольку вы работаете с табличными данными, я бы рекомендовал использовать элемент управления GridView.Тогда вы сможете получить доступ к отдельным ячейкам.

В противном случае вы можете установить td для Field1 и Field4 на runat="server" и дайте им удостоверения личности.Затем в выделенном коде получите доступ к InnerText недвижимость по каждому тд.

Если вы можете позволить себе немного больше накладных расходов при генерации, выберите DataList и используйте свойство DataKeys, которое сохранит нужные вам поля данных.

Вы также можете использовать метки в каждой ячейке таблицы и иметь возможность ссылаться на элементы с помощью e.Item.FindControl("LabelID").

Механизм <%#DataBinder.Eval(...) %> не является привязкой данных в «строгом» смысле.Это односторонний метод размещения текста в определенных местах шаблона.

Если вам нужно вернуть данные, вам необходимо либо:

  1. Получите это из исходных данных
  2. Заполните ретранслятор другим механизмом

Обратите внимание, что повторитель не сохраняет источник данных между обратными передачами. Вы не можете просто попросить его предоставить вам данные позже.

Обычно с первым методом работать проще.Не думайте, что повторное получение данных из источника обходится слишком дорого, если только вы не докажете это себе путем измерений;обычно это довольно быстро.Самая большая проблема этого метода заключается в том, что исходные данные могут меняться между вызовами.

Для второго метода обычно используется элемент управления Literal.Видеть Элисон Чжоупост для примера того, как это сделать.Лично я обычно предпочитаю вместо этого заполнять элементы управления Literal внутри OnItemDataBound.

@peacedog:

Правильный;Метод Элисон вполне приемлем.

Трюк с обходом базы данных:очевидно, они не бесплатны, но веб-серверы, как правило, находятся очень «близко» (быстрое соединение с малой задержкой) к базе данных, в то время как ваши пользователи, вероятно, находятся «далеко» (медленное соединение с высокой задержкой).

Из-за этого отправка данных в/из браузера через файлы cookie, ViewState, скрытые поля или любой другой метод на самом деле может быть «хуже», чем повторное чтение их из вашей базы данных.Следует также помнить о последствиях для безопасности (может ли «злой» пользователь подделать данные, возвращаемые из браузера?Имеет ли значение, если они это сделают?).

Но зачастую это не имеет никакого значения для производительности.Вот почему вам следует делать то, что более естественно для вашей конкретной проблемы, и беспокоиться только об этом. если производительность начинает становиться реальной проблемой.

Удачи!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top