這裏是我的一個簡單的代碼版本:ASP.Net文本OnTextChanged射擊,即使確認爲無效
<asp:TextBox ID="textBox" runat="server" AutoPostBack="true" OnTextChanged="textChanged" CausesValidation="true" ValidationGroup="valGroup"></asp:TextBox>
<asp:RegularExpressionValidator ID="regEx" runat="server" ControlToValidate="textBox" ValidationGroup="valGroup" ErrorMessage="Not a valid number." Display="Dynamic" ValidationExpression="(^0*[1-9]+\d*(\.\d+)?$)|(^0*\.0*[1-9]+\d*$)" />
<asp:Button ID="btnSave" runat="server" Text="Save" OnClick="btnSaveClick" ValidationGroup="valGroup" />
<asp:Button ID="btnCancel" runat="server" Text="Cancel" OnClick="btnCancelClick" CausesValidation="false" />
這與該是應該限制輸入一個正則表達式驗證文本框是唯一正實數。當文本更改並通過驗證時,將調用textChanged()
函數。
如果文本無效,textChanged()
不會觸發,並且保存按鈕也不起作用。
這可按預期工作。
我也有一個取消按鈕,它應該只是清除文本框(和一些其他的東西服務器端)。它應該能夠回發到服務器,不管文本框是否有效,因此CausesValidation="false"
標籤。
我的問題是,當我在文本框中輸入無效的東西,然後單擊取消它實際上執行textChanged()
之前btnCancelClick()
。儘管它是無效的。
這是一個很大的問題,因爲textChanged()
使用文本框作爲數字,所以頁面會引發異常。
我不知道是什麼原因導致textChanged()
被調用。首先,取消按鈕甚至不會調用該函數。正則表達式驗證程序應該防止文本框調用它。
編輯:我試過做一些改變和試驗。
function cancel()
{
document.getElementById('<%=textBox.ClientID%>').value = "";
}
<asp:Button ID="btnCancel" runat="server" Text="Cancel" OnClientClick="cancel()" CausesValidation="false" />
我切換取消按鈕來調用JavaScript方法來嘗試清除該文本框。結果很有趣。
當輸入無效字符串作爲第一件事時,取消按鈕正常工作。它將清除文本框而不調用textChanged()
。
如果我輸入一個有效的號碼,textChanged()
被稱爲我所期望的。但是當我點擊取消按鈕時,它會調用cancel()
,之後立即再次調用textChanged()
,但現在文本框爲空,導致出現異常。
如果我輸入一些有效的東西,然後使其無效,會發生類似的事情。爲有效輸入調用textChanged()
。當添加不正確的輸入時,驗證程序會阻止調用textChanged()
。但是當我點擊取消時,它從cancel()
到textChanged()
。
我在想,也許這是因爲驗證不通過回發持續,但隨着JavaScript函數cancel()
按鈕不能導致頁面回發。 textChanged()
必須是造成它的原因,但我不知道如何。
編輯2:我不打算標記這個解決方案,因爲它仍然是一個巨大的問題在我看來,但我找到了一個解決方法。
<script>
function cancel() {
document.getElementById('<%=textBox.ClientID%>').value = "";
return false;
}
</script>
<asp:Button ID="btnCancel" runat="server" Text="Cancel" OnClientClick="return cancel();" CausesValidation="false" />
這不允許按鈕在任何情況下導致回發。它正在修復不應該在那裏的東西,但它在那裏。
這有助於按鈕點擊,但不能與其他東西。我有一個帶有OnSelectedIndexChanged函數服務器端的GridView。它還會使頁面回到textChanged()
函數。我可以嘗試創建一個JavaScript版本的GridView函數並像取消按鈕那樣修復它,但是在這個階段,我可能會刪除OnTextChanged事件處理函數,並將該函數放在一個按鈕後面。
對不起,但如果你看看我的示例代碼,我已經在文本框上有causevalidation =「true」。我剛剛運行它,它仍然不起作用。 – G3n0c1de