【问题标题】:asp.NET: How to access repeater generated elements?asp.NET:如何访问中继器生成的元素?
【发布时间】:2009-01-26 15:37:11
【问题描述】:

我有一个中继器而不是创建一个表:

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

注意:OnClientClick="todo" 行。

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

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

现在是一些伪代码

伪代码 1:

OnClientClick="DoSomething(theTableRow, CromulentGuid); return false;"

伪代码 2

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

伪代码 3

OnClientClick="javascript:DoSomething(theTableRow, ); return false;"

伪代码 4

OnClientClick="javascript:DoSomething(, ); return false;"

伪代码 5

OnClientClick='javascript:DoSomething(, );返回假;'

无论使用什么 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?

【问题讨论】:

    标签: asp.net repeater


    【解决方案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;
    }
    

    干净多了。更具可读性。更易于维护。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      【解决方案3】:

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

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

      这将为您提供对表格行的引用以及您需要的数据。它确实破坏了对下级的支持,因此 IE6 下的浏览器不会真正按预期工作,但这对于这些天的课程来说几乎是一样的。

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

      【讨论】:

      • 因为表格单元格中除了一个链接之外还有其他东西;为了清楚起见,它们被省略了,因为它们与问题无关。
      猜你喜欢
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      相关资源
      最近更新 更多