【问题标题】:Adding javascript to a link's OnClientClick property while binding a repeater在绑定转发器时将 javascript 添加到链接的 OnClientClick 属性
【发布时间】:2009-04-22 12:19:22
【问题描述】:

我正在尝试让它工作但没有成功:

<asp:Repeater ID="Repeater1" runat="server" OnItemCommand="btnDeleteFamily_Click">
 <HeaderTemplate>
    <table>
       <tr>
          <th width="90" valign="top"><%=getTag("name")%></th>
       </tr>
 </HeaderTemplate>
 <ItemTemplate>
       <tr>
       <td><%#Eval("chrname")%></td>
           <asp:LinkButton ID="btnDeleteFamily" CssClass="fRight ui-icon ui-icon-trash" runat="server" CommandName="delete" CommandArgument='<%#Eval("idmember")%>' OnClientClick='return confirm("<%= getTag("deletefamilymemberdialog") %>")' Text="" ValidationGroup="delete_family" />
       </td>
       </tr>
  </ItemTemplate>
  <FooterTemplate>
     </table>
  </FooterTemplate>
</asp:Repeater>

单击 btnDeleteFamily OnClientClick 时,不显示确认对话框。

getTag(后面代码中的方法)用于本地化以根据语言获取文本。我的意图是在 JavaScript 对话框中显示该消息,但我得到:

<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$rptFamily$ctl01$btnDeleteFamily','')" class="fRight ui-icon ui-icon-trash" id="ctl00_ContentPlaceHolder1_rptFamily_ctl01_btnDeleteFamily" onclick='return confirm("<%= getTag("deletefamilymemberdialog") %>");'/>

所以它不在服务器端处理 getTag 否则我会得到 ​​p>

onclick='return confirm("Are you sure that you want to delete this entry?");'

谢谢

【问题讨论】:

    标签: c# asp.net javascript


    【解决方案1】:

    我认为将消息作为 javascript 变量写入页面是一个更好的解决方案:

    <script>
       var deleteMemberDialogMessage = '<%= getTag("deletefamilymemberdialog") %>';
    </script>
    

    还有你的中继器:

    <asp:LinkButton ID="btnDeleteFamily" CssClass="fRight ui-icon ui-icon-trash"
        runat="server" CommandName="delete" CommandArgument='<%#Eval("idmember")%>' 
        OnClientClick='return confirm(deleteMemberDialogMessage)' Text="" 
        ValidationGroup="delete_family" />
    

    顺便确保您的 deletefamilymemberdialog 消息没有单引号。

    编辑:如果要将数据源中的值绑定到中继器,则应将列绑定到控件而不是像这样的 Response.Write (

    <asp:LinkButton ID="btnDeleteFamily" CssClass="fRight ui-icon ui-icon-trash"
     runat="server" CommandName="delete" CommandArgument='<%#Eval("idmember")%>' 
    OnClientClick='<%# Bind("return confirm('{0}');'", "YourColumnName") %> Text="" 
    ValidationGroup="delete_family" />
    

    【讨论】:

    • 如果您必须使用 Eval() 从转发器传递一个值怎么办?你会怎么做?
    • 我向您的解决方案建议了这个,看起来您正在显示一条静态消息。
    • 是的,我同意,但是如果消息取决于中继器中的某个值怎么办。只是想知道......
    • Canavar,你能把 OnClientClick='return confirm(deleteMemberDialogMessage) %&gt;")' 改成 OnClientClick='return confirm(deleteMemberDialogMessage)'你的答案将是正确的。谢谢
    • 对不起,我没有解释清楚。我的意思是如果你想做类似 OnClientClick='return confirm("")' 的事情。你明白我的意思吗?
    【解决方案2】:
    protected void Repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        LinkButton lb = e.Item.FindControl("btnDelete") as LinkButton;
        if (lb != mull) {
             lb.OnClientClick = "whatever";
         }
    }
    

    【讨论】:

      【解决方案3】:

      至少对我来说似乎没问题。

      您可以在 firefox 中尝试,使用 WebDeveloper 工具栏或 Firebug 扩展,您将能够获得有关幕后发生的更多信息。

      可能页面上还有其他错误导致此代码无法正常工作。

      【讨论】:

      • 嗨 Ekeko,这不好,因为在浏览器中我得到 onclick='return confirm("");'我应该得到类似 onclick='return Confirm("Are you sure you want to delete this entry?");'
      【解决方案4】:

      如果您想在确认模式下使用 jQuery 对话框绑定到更新面板内中继器上的链接按钮,并且您要在确认后执行的代码对于每一行都不同,您可以这样设置:

      向您的页面/控件添加一个 javascript 函数,如下所示:

      function confirm(buttonFunctionForPostBack)
      {
          $("#dialog").dialog('option', 'buttons', { 
                    "Cancel": function() { 
                        $(this).dialog("close"); 
                    },
                    "Delete Payment": function () { 
                        eval(buttonFunctionForPostBack); 
                        $(this).dialog("close"); 
                        }
                    }
          ).dialog('open');
      }
      

      在你的代码后面:

      public void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
      {
          LinkButton lb = e.Item.FindControl("deleteButton") as LinkButton;
          if (lb != null)
          {
              lb.OnClientClick = "confirm(\"" + this.Page.ClientScript.GetPostBackEventReference(lb, string.Empty) + "\");return false;";
          }
      }
      

      在你的 aspx 页面中:

      <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
        <HeaderTemplate>
          <table>
             <tr>
                <th width="90" valign="top"></th>
             </tr>
       </HeaderTemplate>
       <ItemTemplate>
             <tr>
               <td><%#Eval("name")%></td>
               <td><asp:LinkButton ID="deleteButton" runat="server" CommandName="delete" CommandArgument='<%#Eval("id")%>' Text="Delete" />
               </td>
             </tr>
        </ItemTemplate>
        <FooterTemplate>
           </table>
        </FooterTemplate>
      </asp:Repeater>
      

      这使您可以利用这样一个事实,即您可以在创建对话框后设置对话框的“按钮”选项。此外,它不需要任何额外的脚本变量。

      【讨论】:

        猜你喜欢
        • 2017-01-21
        • 1970-01-01
        • 1970-01-01
        • 2015-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多