ASP:Checkbox如何仅在选中时自动回复?

时间:2010-01-07 16:58:41

标签: asp.net javascript checkbox postback autopostback

我有一个如下设置的复选框:

<asp:CheckBox ID="myCheckbox" runat="Server" OnClick="showLoadingScreen(this.checked);" AutoPostBack="true" Text="Check me for more data!" /> 

showLoadingScreen函数如下:

function showLoadingScreen(isChecked) {         
if (isChecked)
    {
        document.getElementById('form1').style.display='none';
        document.getElementById('img_loading').style.display='block';
    }
else { return false; }
}

我已经添加了else子句,希望我只能在复选框被选中后回复,但它会在任何一种情况下都回发。

我在页面上有一个网格(在form1内),在页面加载时有一组数据加载到它,但为了添加一些额外的数据,我添加了这个复选框(它运行时间更长)进程,所以我只想按需加载,而不是预先加载。当它被检查时,我想显示加载gif,回发,抓取数据,然后返回。如果取消选中该框,我不想做任何事情,因为在页面上留下足够多的数据是完全正常的(也就是说,预先显示的数据是选中复选框时显示的数据的子集)。

是否有任何方法可以使复选框自动回复,但未取消选中?

编辑:使用Dark Falcon的建议,我已将复选框修改为:

<asp:CheckBox ID="myCheckbox" runat="Server" OnClick="return showLoadingScreen(this.checked);" AutoPostBack="true" Text="Include HQ Values" /> 

和javascript:

function showLoadingScreen(checked) {         
alert(checked);
if (checked)
    {
        document.getElementById('form1').style.display='none';
        document.getElementById('img_loading').style.display='block';
        document.form1.submit();  //my own addition, to get it to post back
    }
else { return false; }
}

现在,它会在已检查时回复,但该框无法再取消选中。正如您所看到的,我添加了一个警报来显示传入的值。当您取消选中该框时,它会传递正确的值(false),但之后会以某种方式再次检查。

这不是一个大问题,因为没有理由不取消选中该框(因为正如我之前所说,检查时数据集是未经检查的数据集的超集),但我仍然想知道它为什么这样做那。有什么想法吗?

4 个答案:

答案 0 :(得分:5)

在这种情况下,请勿设置AutoPostBack。 "AutoPostBack"表示在此控件的值发生更改时回发到服务器... NOT 您想要的内容。

相反,使用GetPostBackEventReference(myCheckbox,"")获取相应的回发脚本,如果选中此复选框,则从showLoadingScreen方法调用此脚本。

答案 1 :(得分:0)

对于你的onclick处理程序,你需要这样做:

return showLoadingScreen(this.checked);

答案 2 :(得分:0)

尽量避免使用_doPostback,因为它是一个hack,您必须知道哪些控件ID正在回发,以及Microsoft ASP.NET中该Javascript函数的其他参数。要了解幕后发生的事情,你必须知道为什么会有回发以及如何防止回发发生。

以下是设置自动回发时ASP.NET复选框(ASP:Checkbox)发生的情况:

<ASP:Checkbox runat="server" id="chkCheckbox" AutoPostback="true" onclick="return isDoPostback(this.checked);" ClientIdMode="static" ... />

生成的HTML代码是:

<input type="checkbox" ... id="..." onclick="return isDoPostback(this.checked);_doPostback(...);" .../>

自定义onclick事件将附加到复选框的onclick事件的开头。无论你做什么,都会执行前置函数调用。最糟糕的是,如果你有一个返回值,_doPostback永远不会被执行。

这是你真正想做的事情(我在这里使用jQuery和原生Javascript的混合):

var checkbox = $("#chkCheckbox");
...

checkbox .on("change", function(e)
{	if(this.checked)
	{
		var isConfirmedToContinue = confirm("Continue with Postback?");

		if(!isConfirmedToContinue)
		{	this.checked = false;	//Uncheck the checkbox since the user canceled out
			var onClickDelegate = this.onclick;

			if(onClickDelegate)
			{	var me = this;
				this.removeEventListener("click", onClickDelegate);	//Remove the onclick event so that auto-postback no longer happens

				setTimeout(function()
				{    //Add back the onclick delegate after 250ms    
                    me.addEventListener("click", onClickDelegate);
				}, 250);

				this.onclick = null; //Remove the current onclick event by nulling it out
			}
        }
    }
});

答案 3 :(得分:-1)

尝试使用JS例程检查是否已选中,如果设置为true,请尝试执行以下操作:

_doPostBack(checkElementReference.name,“”);

_doPostBack负责为服务器执行通常不回发的控件的帖子。您必须传递元素的名称,该名称在服务器上恰好是服务器端复选框控件的UniqueID属性。