2010-01-07 80 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 } 
 
     } 
 
    } 
 
});

相關問題