2010-01-07 81 views
2

我已经得到了我们设置了如下复选框:ASP:复选框如何仅在检查时自动回复?

<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,回发,获取数据并返回。如果该框未被选中,我不想做任何事情,因为在页面上留下足够多的数据是完全正确的(也就是说,预先显示的数据是复选框被选中时显示的数据的子集)。

有什么办法可以让复选框自动回复选中状态,但不会取消选中?

编辑:使用暗隼的建议,我已经修改了复选框的样子:

<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)时,它会传递正确的值,但是它会以某种方式再次被检查。

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

+0

不要紧,你的代码是什么样子的VS设计师。您需要查看浏览器中的标记以确定如何解决问题。 – 2010-01-07 17:24:10

+0

乔希,请参阅我的编辑。我接受了你的建议,在浏览器中查看源代码,它会像这样回来: 你可以看到不知何故checked =“checked”被添加,我觉得它是如何仍然检查,尽管JavaScript返回false。任何想法如何让它不添加检查=“检查”部分? – 2010-01-07 18:57:40

+0

我宁愿建议:取消选中复选框并进行回调,但不提供任何控制。这可以确保您没有不一致的服务器/客户端控制状态。 – citronas 2010-01-07 18:58:17

回答

5

在这种情况下不要设置AutoPostBack。 "AutoPostBack"意味着任何时候这个控件的值发回到服务器......这是不是你想要什么。

而是使用GetPostBackEventReference(myCheckbox,"")来获取适当的回发脚本,并在复选框被选中时从showLoadingScreen方法调用此方法。

+0

我想弄清楚GetPostBackEventReference是如何工作的。在阅读了关于它的一些其他问题之后,我觉得我应该在我的javascript函数中使用它,例如: <%= Page.ClientScript.GetPostBackEventReference(myCheckbox)%>; 但是,我该如何处理服务器端?在页面加载?我在那里检查什么? – 2010-01-08 12:58:01

+0

不确定你在处理服务器端意味着什么?这似乎是一个非常正常的回传。将评论中的代码直接粘贴到showLoadingScreen()中,然后取出AutoPostBack ...然后您将看到您正在查找的行为。从本质上讲,整个问题是你永远不应该有AutoPostBack设置为true。试图解决这个问题是造成这种奇怪行为的原因。 – Bryan 2010-01-08 23:25:12

0

为了您的onclick处理程序,你需要做的:

return showLoadingScreen(this.checked); 
+0

D'oh!我知道这很简单。但是,它没有发回到检查服务器,只做了Javascript的东西。所以我加了“document.form1.submit();”到javascript的If部分;但现在复选框不会被取消选中,哈哈。有任何想法吗? – 2010-01-07 17:06:41

-1

尝试使用JS例行检查它是否被选中,如果它被设置为true,尝试做:

_doPostBack( checkElementReference.name,“”);

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

+1

你确实需要在这里使用GetPostBackEventReference()。 – Bryan 2010-01-07 20:55:07

+0

不,你不知道。很多人使用_doPostBack;这是在客户端,所以这是适当的(因为它是在屏幕上呈现的),但我明白你在说什么。但这不是必需的。 – 2010-01-08 01:52:51

0

尽量避免使用_doPostback,因为它是一个黑客,你将不得不知道什么控制ID回来和微软ASP.NET的Javascript函数的其他参数。要了解幕后发生的事情,您必须知道为什么会有回传以及如何防止回传发生。

这里是做什么用的ASP.NET复选框发生(ASP:复选框)时自动回传设置:

<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) 
 
{ \t if(this.checked) 
 
\t { 
 
\t \t var isConfirmedToContinue = confirm("Continue with Postback?"); 
 

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

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

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

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

相关问题