【问题标题】:How do I pull the clientID of an asp:button inside an asp:listview for use with jQuery?如何在 asp:listview 中提取 asp:button 的 clientID 以与 jQuery 一起使用?
【发布时间】:2010-10-01 10:39:38
【问题描述】:

我正在尝试做一些应该相对简单的事情。我正在使用 ListView 显示许多项目,使用 ItemTemplate。在 ItemTemplate 内,我有一个围绕整个项目的 div,以便我可以突出显示悬停事件(已由 jQuery 处理)。

我想做的是让 div 上的 click 事件触发一个按钮以打开该特定项目的详细信息视图。我遇到的问题是在使用 jQuery 时拉回该按钮的 ClientID。我试过了:

$('#<%= Button1.ClientID %>')

路由,但这不起作用,因为页面加载时按钮不存在。

基本代码如下:

<asp:listview>
 <itemtemplate>
  <td runat="server">
   <div class="container">
    <asp:linkbutton id="Button1" runat="server" text="View Details" />
     fun and exciting stuff here...
   </div>
  </td>
 </itemtemplate>
</asp:listview>

非常感谢任何建议或帮助!

【问题讨论】:

    标签: c# asp.net jquery


    【解决方案1】:

    你为什么不给那些链接按钮一个特定的 css 类?

    <asp:linkbutton id="Button1" runat="server" text="View Details" CssClass="detailsButtons" />
    

    然后在 jquery 中只需选择一个类即可在一次调用中将它们全部分配。

    $(".detailsButtons").click( function() { .... } );
    

    如果由于当时没有生成对象而导致不起作用,您可以使用jquery 中的新live() 方法。它还将事件分配给任何动态添加的元素。

    希望对你有帮助

    【讨论】:

    • 非常有趣的想法,使用 live() 方法。我可能会试一试。类想法的问题是我需要在特定按钮上触发 click() 事件,因此一次分配所有按钮无法完成我所需要的。但是,活的东西可能会起作用,所以我要尝试一下!
    • +1 如果项目属于逻辑类,则应照此引用。这正是正确的解决方案(bdukes 给出了实际答案)。
    【解决方案2】:

    而不是使用scriptlet:

    $('#<%= Button1.ClientID %>')
    

    使用绑定表达式:

    $('#<%# Button1.ClientID %>')
    

    注意区别在于 # 而不是 =

    绑定表达式在绑定数据时进行计算,因此您的表达式将在当前数据项的上下文中进行计算。 Scriptlet 在页面呈现时(在页面生命周期的最后阶段)进行评估,并在页面的上下文中进行评估,而不是在特定的数据项中进行评估。

    【讨论】:

    • 我在 ItemTemplate 中试过这个 不适用于 ListView。
    【解决方案3】:

    将方法连接到 ListView 的 ItemDataBound 事件。在那里,您可以在ListViewItemEventArgs 参数的Item 属性上使用FindControl 方法来获取对列表中每个项目的LinkBut​​ton 的引用。从该引用中,您可以获取 ClientID,并使用它做任何您需要做的事情。

    更新
    就您可以对按钮的引用做什么而言,最简单的可能是在 ItemDataBound 事件中分配您的点击事件,可能是这样的

    var button = (Button)e.Item.FindControl("Button1");
    button.OnClientClick = "ShowEditDialog(" + Eval("ItemId") + ")";
    

    如果您需要在客户端连接它,也许您可​​以维护一个将 ClientID 映射到项目 ID 的字典,并将该字典发送到客户端,在那里您可以对其进行迭代并将事件连接起来。

    【讨论】:

    • 虽然您的解决方案一开始似乎可行,但问题是将 ClientID 注入页面,以便我可以在客户端使用 jQuery 引用它。也许我不明白你的意思?
    • 正是我需要的!感谢您的修复!
    【解决方案4】:

    您可以使用以下语法选择按钮(假设 Button1 是按钮的服务器 ID):

    $("[id$=Button1]")
    

    这将选择 id 以“Button1”结尾的所有 DOM 元素。

    这是必要的,因为元素的最终客户端 ID 反映了服务器控制结构。

    【讨论】:

      【解决方案5】:

      你甚至可以使用cssclass来触发点击..

      <a class="confirm" id="alert" onmouseover="got('<%# Eval("Gift_ID") %>','<%= Session["member_id"] %>')">Redeem Now</a> 
      

      并使用jquery触发点击甚至基于这个类..

      $(function() {
              $(".confirm").easyconfirm();
              $(".confirm").click(function() {
                  var id = document.getElementById("test").value;
                  var mem_id = document.getElementById("test1").value;
                  document.getElementById("test").setAttribute("value", "");
                  document.getElementById("test1").setAttribute("value", "");
                  var param = "{'id':'" + id + "','mem_id':'" + mem_id + "'}"
                  $.ajax({
      
                      type: "POST",
                      url: "Offer.aspx/Hello_World",
                      data: param,
                      contentType: "application/json; charset=utf-8",
                      dataType: "json",
                      async: true,
                      cache: false,
                      success: function(msg) {
                          alert("hello");
                          $('#myDiv').text(msg.d);
      
                      }
                  });
      
              });
      
          });
      

      【讨论】:

        【解决方案6】:

        如果是你所追求的点击事件,你不能使用链接按钮的 OnClientClick 属性吗?还是他们在 3.5 中删除了它?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-09
          • 1970-01-01
          • 2012-02-20
          • 1970-01-01
          • 1970-01-01
          • 2010-12-28
          • 2012-02-16
          • 2010-11-25
          相关资源
          最近更新 更多