asp.NET:如何访问转发器生成的元素?

时间:2009-01-26 15:37:12

标签: asp.net repeater

我有一个转发器而不是创建一个表:

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

注意: OnClientClick="todo"行。

在最终渲染的代码中,我希望 todo 包含对javascript函数的调用,传递:

  • 生成的表格行的ID,以及
  • 当前绑定对象的属性的Eval

现在有些伪代码

伪代码1:

OnClientClick =“DoSomething(theTableRow,CromulentGuid); return false;”

伪代码2

OnClientClick =“javascript:DoSomething(theTableRow,CromulentGuid); return false;”

伪代码3

OnClientClick =“javascript:DoSomething(theTableRow,&lt;%#Eval(”CromulentGuid“)%&gt;);返回false;”

伪代码4

OnClientClick =“javascript:DoSomething(&lt;%= theTableRow%&gt;,&lt;%#Eval(”CromulentGuid“)%&gt;);返回false;”

伪代码5

OnClientClick ='javascript:DoSomething(&lt;%= Eval(theTableRow)%&gt;,&lt;%#Eval(“CromulentGuid”)%&gt;);返回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>

注意:我对第二种形式没问题,因为我知道它在功能上是相同的,并且ASP.NET代码无法生成前者,即使后者的可读性较差。


相关问题:

ASP.NET: How to access repeater generated elements from javascript?

3 个答案:

答案 0 :(得分:1)

更好的解决方案是put the presentation logic in the business layer

<强>演示:

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

更清洁。更具可读性。更加可维护。

答案 1 :(得分:0)

您可以使用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()语法,但它应该有所帮助。

答案 2 :(得分:0)

为什么不将JS放在表格行上?

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

这将引导您对表行以及您需要的数据的引用。它确实打破了低级别的支持,因此IE6下的浏览器不会像预期的那样真正起作用,但是这些日子里的浏览器非常相似。

另外两种可能性是利用Datagrid / Gridview对象和OnItemDatabound方面,或者使用ASP.NET TABLE控件在代码中构建表,并手动迭代数据源。