【问题标题】:Confirm Delete pop up with Record Count使用记录计数确认删除弹出窗口
【发布时间】:2015-07-12 03:22:09
【问题描述】:

一般信息:

Aspx 页面包含一个 Ascx 用户控件。在 User 控件中,Repeater 包含在 View 中,包含在 Multiview 中。 Asp.Net 2.0 框架/C#

详情:

我有一个显示记录的中继器(在 ascx 用户控件内),第一列是一个复选框。如果选中,该行将被删除。 在中继器之外,我有一个按钮,可以删除所有选中的行。

一切正常,但被要求添加一个弹出“确认删除”消息,其中包括如果用户在弹出窗口中单击“确定”将删除的记录数。

类似: “您即将删除 8 条记录”。

目前我的按钮如下所示:

    <asp:Button ID="btnDeleteAllRecords" runat="server" Text="Delete all Checked Records" Onclick="btnDeleteAllRecords_Click" OnClientClick="javascript:GetCbCount();" />

我有这个 javascript 代码块:

<script type="text/javascript">
function GetCbCount()   
{
var cb = document.getElementById("rptrVoicemail").getElementsByTageName("input");
  var cbCount;   
for(i = 0;  i < cb.lenght; i++)   
{   
    if(cb[i].type == "checkbox")   
    {   
        if(cb[i].checked)   
        {   
            cbCount =  cbCount + 1;   
        }               
    }       
}
return confirm('You are about to delete' + cbCount + 'records.');

} 
</script>

当我点击我的按钮时,我得到:

错误:'document.getElementById(...)' 为 null 或不是对象 在这一行:

var cb = document.getElementById("rptrVoicemail").getElementsByTageName("input");

为什么 JS 看不到我的中继器?是因为它被埋在 MultiView 中吗? JS如何改正,让弹窗显示消息中的记录数?

更新: 我将脚本更改为:

function GetCbCount(){ 
   var inpt = document.getElementById("vmDiv"); 
   var checkboxes = inpt.getElementsByTagName("input"); 
   var cbCount; 
   for(i = 0; i<checkboxes.lenght;i++){ 
      if (checkboxes[i].type == "checkbox" && checkboxes[i].checked){ 
         cbCount = cbCount + 1;
      } 
   } 
   return confirm('You are about to delete ' + cbCount + ' Voicemails.'); 
} 

【问题讨论】:

  • 在函数中,该行以var cb = ... 开头,在您的错误描述中以var inpt = ... 开头。这是疏忽吗?
  • 嗨,蒂姆,感谢您指出这一点。这是一个疏忽。我更正了我的帖子。
  • 你的按钮在中继器旁边吗?如果是这样,您可以使用 DOM-Model 来获取他。另一个问题:您的 Javascript 位于页面的什么位置,还是包含在页面内?

标签: javascript asp.net repeater


【解决方案1】:

这应该可行:

document.getElementById('<%= rptrVoicemail.ClientID %>').getElementsByTageName("input");

另一种方法是这个返回 ClientID 的小脚本。您甚至可以将其添加到包含的 JS 文件中。

function GetClientId(strid)
{
     var count=document.forms[ 0 ].length ;
     var i = 0 ;
     var eleName;
     for (i = 0 ;  i < count ;  i++ )
     {
       eleName = document.forms [ 0 ].elements[ i ].id;
       pos=eleName.indexOf( strid ) ;
       if(pos >= 0)  break;          
     }
    return eleName;
 }

找到here

【讨论】:

  • 嗨,蒂姆,在尝试您的脚本之前,我对原始脚本进行了一些更改:
  • 它正在工作,但现在无论单击哪个按钮 = OK 或 Cancel 都会删除记录。我的退货声明不正确吗?
  • 另一个更新:我将 OnClientClick 语句更改为: OnClientClick="if(GetCbCount() == false)return false;"现在单击“取消”会停止删除。新问题:确认弹出窗口现在显示“您将要删除未定义的记录”。 “未定义”应该是我的记录总数。
  • 我已经用你当前的脚本更新了你的问题(来自上面的评论)。是的,只有当用户单击确定时,您必须返回 GetCbCount() 才能删除。我会用以下方式定义 cbCount:var cbCount = 0;
【解决方案2】:

如果您使用母版页或嵌套控件(在 ascx、视图等内部),框架将更改随元素呈现的 ID。

如果您执行“查看源代码”或使用 FireBug,您可能会看到 rptrVoicemail 变成了类似于 ctl00_ContentPlaceHolder1_someUserControl_ctl00_multiViewID_ctl28_rptrVoicemail

您可以使用getElementById('&lt;%= rptrVoicemail.ClientID %&gt;') 获取元素的 ID,因为它将在客户端上呈现。

编辑:为了帮助调试,做这样的事情......你明白了。 var rptr = document.getElementById('<%= rptrVoicemail.ClientID %>'); rptr.borderColor = 'pink'; // draw a border to check it's the right element

【讨论】:

  • 谢谢。刚刚做了一个ViewSource。 Repeater 呈现为普通的 html 表。该表在 Viewsource 中呈现的 id 为“tblRecords”。是的,我正在使用母版页。所以树将是 aspx 页面(带有 MasterPage)、ascx 用户控件、MultiView、View、Repeater。
  • repeater 通常不渲染任何东西——它只是一个声明性的替换 for 循环,它将吐出 HeaderTemplate、ItemTemplate、FooterTemplate 中定义的任何内容。
  • 对。由于我在 Repeater ItemTemplate 中创建了一个 html 表,所以它正在吐回一个表。
  • 检查 HeaderTemplate 是否包含 &lt;table id="tblRecords"...&gt;,页脚是否包含 &lt;/table&gt;,并且 ItemTemplate 是否包含 &lt;tr&gt;...&lt;/tr&gt; 中的行。否则,您最终会得到所有具有相同 ID 的 HTML 表格。
  • 嗨,Leon,我的桌子已经按照您的指示布置好了。其他表确实有不同的id。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
相关资源
最近更新 更多