asp.NET: Как получить доступ к элементам, созданным повторителем? - PullRequest
0 голосов
/ 26 января 2009

У меня есть повторитель, чем создается таблица:

<itemtemplate>
   <tr id="theTableRow" runat="server">
      <td>
         <asp:LinkButton runat="server"
            OnClientClick="todo"
            Text="Do Something" />
      </td>
   </tr>
</itemtemplate>

Примечание: строка OnClientClick="todo".

В окончательном отрендеренном коде я хочу, чтобы todo содержал вызов функции javascript, передавая:

  • идентификатор сгенерированной строки таблицы и
  • Оценка свойства текущего связанного объекта

А теперь для некоторого псевдокода :

Псевдокод 1:

OnClientClick = "DoSomething (theTableRow, CromulentGuid); вернуть false;"

Псевдокод 2

OnClientClick = "javascript: DoSomething (theTableRow, CromulentGuid); вернуть false;"

Псевдокод 3

OnClientClick = "javascript: DoSomething (theTableRow, <% # Eval (" CromulentGuid ")%>); вернуть false;"

Псевдокод 4

OnClientClick = "javascript: DoSomething (<% = theTableRow%>, <% # Eval (" CromulentGuid ")%>); вернуть false;"

Псевдокод 5

OnClientClick = 'javascript: DoSomething (<% = Eval (theTableRow)%>, <% # Eval ("CromulentGuid")%>); вернуть false; '

Каким бы ни был код ASP.NET, я хочу, чтобы отображаемый HTML был:

<tr id="ctl00__itemRepeater_ctl01_theTableRow">
   <td>
      <a 
            onclick="DoSomething('ctl00__itemRepeater_ctl01_theTableRow', '19a149db-5675-4eee-835d-3d78372ca6f9'); return false;"
            href="javascript:__doPostBack('ctl00$itemRepeater$ctl01$ctl04','')">
         Do Something
      </a>
   </td>
</tr>

со мной тоже все будет в порядке:

<tr id="ctl00__itemRepeater_ctl01_theTableRow">
   <td>
      <a 
            onclick='DoSomething(&quot;ctl00__itemRepeater_ctl01_theTableRow&quot;, &quot;19a149db-5675-4eee-835d-3d78372ca6f9&quot;); return false;'
            href="javascript:__doPostBack('ctl00$itemRepeater$ctl01$ctl04','')">
         Do Something
      </a>
   </td>
</tr>

Примечание: Я в порядке со 2-й формой, поскольку знаю, что она функционально идентична, и код ASP.NET не может сгенерировать первую, даже если последняя менее читаема.


Смежные вопросы:

ASP.NET: как получить доступ к сгенерированным повторителем элементам из javascript?

Ответы [ 3 ]

1 голос
/ 27 января 2009

Лучшее решение - поместить логику представления в бизнес-уровень :

Презентация:

<asp:LinkButton runat="server"
     OnClientClick="<%# GetItemClientClick((MySomething)Container.DataItem) %>"
     Text="Do stuff" />

Бизнес-логика

protected string GetItemClientClick(MySomething item)
{
   ...   
   String szOnClientClick = 
      "return DeleteItem(this, "+
          Toolkit.QuotedStr(item.NodeGUID.ToString()) + ", "+
          Toolkit.QuotedStr(GetItemText(item))+");";

   return szOnClientClick;
}

намного чище. Гораздо более читабельно. Гораздо более ремонтопригодны.

0 голосов
/ 26 января 2009

Почему бы не поставить JS на строку таблицы?

<tr onClick="DoSomething(this, '<%# Eval("GUIDColumn") %>')"; ><td>
<%# Eval("ColumnText") %>
</td></tr>

Это дает вам ссылку на строку таблицы и данные, которые вам нужны. Поддержка не поддерживается, поэтому браузеры под IE6 не будут работать должным образом, но в наши дни это вполне нормально.

Двумя другими возможностями являются использование объекта Datagrid / Gridview и аспектов OnItemDatabound или создание таблицы в коде с использованием элемента управления ASP.NET TABLE и повторение источника данных вручную.

0 голосов
/ 26 января 2009

Вы можете использовать событие OnItemDataBound для изменения каждого элемента в вашем коде. Поскольку вы особенно разбираетесь в HTML, я бы также рекомендовал использовать гибридные элементы управления, а не элементы управления asp. Например:

<itemtemplate>
   <tr id="theTableRow" runat="server">
      <td>
         <a runat="server"
            onclick="todo(this.parent.parent, '<%# Eval("Property") %>');return false;" >
            Do Something
         </a>
      </td>
   </tr>
</itemtemplate>

Это, вероятно, не на 100% идеально, так как я просто набрал его прямо в окне ответа, и я всегда искажал синтаксис Eval () при первом запуске, но это должно помочь некоторым.

...