我在更新面板中有一个网格视图,网格视图的第一列有一个复选框。当我第一次创建它时,它运行良好。复选框设置为AutoPostBack,并导致异步回发,在那里我可以处理数据并刷新网格视图,而不会影响页面的其余部分。
但是,我需要在页面、客户端测试某个条件,并向用户显示一个确认框,上面写着"此人没有为此设置"。你确定要继续吗?'
最初,我在gridview的RowDataBound事件中放入了一些类似的代码;
CheckBox cb = (CheckBox)e.Row.FindControl("myCheckBox");
cb.Attributes.Add("onclick", "return check('" + ContactName + "');");
并且有一个javascript函数,其行文如下:
function check(ContactName)
{
if (document.getElementById('Listed') == false)
{
if (confirm('This person is not listed, are you sure you want to continue?'))
{
return true;
}
return false;
}
}
请忽略上面代码中的拼写错误,如果是记忆输入的,请忽略。问题是,它有效。如果我的局部变量Listed为false,它会抛出确认框。
问题是,如果您在确认框中选择"OK",则复选框生成的Postback(应该是异步的,因为它位于ChildrenAsTriggers=true的更新面板内)将被取消。我必须在javascript确认后调用__doPostback才能进行Postback。但是,我得到的是完全回发,而不是我想要的异步回发。
所以,我的问题是,如何防止带有javascript确认的复选框进行异步回发,这样,如果在javascript确认中选择"OK",异步回发就会发生。
正如我所说,目前,我能让它工作的唯一方法是在用户单击"OK"后进行完整的回发。
此位置的链接讨论如何通过JavaScript:取消异步回发
http://www.ajaxtutorials.com/ajax-tutorials/cancel-asynchronous-postback-in-c/
重要的部分在这里:
<script type="text/javascript">
var instance = Sys.WebForms.PageRequestManager.getInstance();
instance.add_initializeRequest(instance_initializeRequest);
function instance_initializeRequest(sender, args) {
if (args.get_postBackElement().id == 'btn_Cancel') {
instance.abortPostBack();
alert('Postback has been cancelled. Time will not be updated.');
}
}
</script>
回发和异步回发的区别在于,异步只是在提交之前修改表单的一些值,然后再将其设置回。这些值指示哪个控件用什么类型的信息发起请求,还指示一些目标信息,这些信息用于将响应html呈现为哪个iframe。我只是把我的一些想法带到这里,实现在不同的情况下是不同的。