我在更新面板中有一个gridview,在gridview的第一列中有一个复选框。当我第一次创建它时,它工作正常。该复选框设置为AutoPostBack并导致异步回发,我可以处理数据并刷新gridview,而不会影响页面的其余部分。
但是,我需要在页面,客户端测试某个条件,并向用户显示一个确认框,其中显示“此人未设置此项。你确定要继续吗?'
我最初是通过在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,它会抛出确认框。
问题是,如果在确认框中选择“Okay” - Checkbox生成的Postback(应该是异步,因为它位于具有ChildrenAsTriggers = true的更新面板内)将被取消。我必须在javascript确认之后调用__doPostback以使Postback发生。但是,然后,我得到一个完整的回发,而不是我想要的异步回发。
所以,我的问题是,如何阻止来自带有javascript确认的复选框的异步回发,这样,如果你在javascript确认中选择了Okay,就会发生异步回发。
正如我所说,目前,我能让它发挥作用的唯一方法是在用户点击Okay后进行完整的回发。
答案 0 :(得分:1)
此位置的链接讨论了如何通过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>
答案 1 :(得分:1)
Garrison Neely提供的方式应该适合你。
回发和异步回发之间的区别是异步只是在提交之前修改表单的某些值,然后在之后设置它们。这些值指示哪个控件使用什么样的信息启动请求,还有一些目标信息用于哪个iframe应该响应html。我只想在这里提出一些想法,不同情况下的实施方式各不相同。