2012-09-28 59 views
2

我有一個帶有複選框和幾個文本框的ASP.NET頁面。ASP:複選框後更改後的值已經通過Javascript更改了值

當用戶剔除複選框時,我需要執行一系列檢查並通知用戶結果。我通過複選框AutoPostBack屬性做一回發這些檢查:

<asp:CheckBox ID="chkDecision" runat="server" AutoPostBack="true" /> 

另一個業務規則我實現的是,當複選框取消選中,並且用戶開始在文本框中的一個打字,我不得不自動勾選檢查框。我正在通過Javascript做到這一點:

<asp:TextBox ID="txtLeft" runat="server" CssClass="textboxstandard" MaxLength="50" onkeyDown="SelectDecision(event);"> 

function SelectDecision(e) { 
     if (!checkSpecialKeys(e)) { 
      var chkDec = $get('<%=chkDecision.ClientID %>'); 
      if (!chkDec.checked) { 
       chkDec.checked = true; 
      }     
     } 
    } 

以上所有的工作正常。

我得到的這個問題是,當用戶開始在一個盒子中輸入時,複選框會打勾。如果他們然後手動取消選中該框,則回發不會觸發。

大概這是因爲複選框與頁面加載時處於相同的狀態,所以一些內部邏輯認爲回發不必要。

如何執行上述場景中提到的服務器端檢查?

定稿 由於下面給出的幫助下,我能提供的答案測試期間該另一個自己進步。我發現我可以設置文本框的AutoPostBack屬性:

<asp:TextBox ID="txtLeft" runat="server" CssClass="textboxstandard" MaxLength="50" onkeyDown="SelectDecision(event);" AutoPostBack="true"></asp:TextBox> 

我的方案,同時實現如下同樣的事情,我發現它是爲回發編輯完成後,會出現更多的使用。感謝你的幫助!

+0

是你的工作? –

+0

謝謝Pranay - 週末我遠離我的源頭,但我會在星期一嘗試你的建議,並接受你的答案,如果它解決了我的問題。再次感謝! – Stewart

回答

2

服務器不會覆蓋客戶端更改。你可以爲checkedchange事件寫javascript。

你shold做如下,此功能檢查並取消複選框,消防服務器端自動回

<script type="text/javascript"> 
     function SelectDecision() { 


      var chkDec = $get('<%=chkDecision.ClientID %>');     

      //For checking or unchecking the checkbox. 
      if (chkDec .checked) { 
       chkDec .checked = false; 
      } 
      else { 
       chkDec .checked = true; 
      } 


      //For firing the click event. 
      if (document.createEventObject) { 
       // dispatch for IE 
       var evt = document.createEventObject(); 
       return element.fireEvent('on' + 'click', evt) 
      } 
      else { 
       // dispatch for firefox + others 
       var evt = document.createEvent("HTMLEvents"); 
       evt.initEvent('click', true, true); // event type,bubbling,cancelable 
       return !element.dispatchEvent(evt); 
      } 
     } 
    </script> 

更多:http://forums.asp.net/t/1445241.aspx/1/10

+0

這個事件觸發代碼比直接調用__doPostBack更好。 (至少在IE中)。爲了幫助未來的搜索者,應該在事件代碼中使用'chkdec'而不是'element'。 '元素'會給一個Javascript未定義的錯誤。這保留了鍵入的字符,但它確實在文本框上進行了關閉編輯,因此您需要重置焦點(在處理回發時考慮到輸入的字符)。 – Stewart

1

您可以使用:

function SelectDecision(e) { 
    if (!checkSpecialKeys(e)) { 
     var chkDec = $get('<%=chkDecision.ClientID %>'); 
     if (!chkDec.checked) { 
      chkDec.checked = true; 
      __doPostBack('<%=chkDecision.ClientID %>', ''); 
     }     
    } 
} 
+0

我收到JavaScript錯誤「SCRIPT5007:屬性'__postback'爲null或未定義,不是函數對象「,這個解決方案需要__postback是__doPostBack而不是它,它會觸發。不同於Pranay的回答,這個導致相關文本框中輸入的字符消失。 – Stewart

+0

當然,我忘記了功能名稱拼寫 –

+0

Pranay的答案包含許多不必要的事情,吸引人的是檢查瀏覽類型和上升事件。當事件發生時,doPostBack函數將會調用。爲什麼你需要不必要的東西? –