在做東西的時候偶爾同時用到javascript的事件和.net的驗證控制項,具體細節如下:
<head runat="server">
<title>Untitled Page</title>
<script language="javascript" type="text/javascript">
var IsDetailsModifed = true
function SubmitDetailModified()
...{
var retvalue;
if (IsDetailsModifed == true)
...{
retvalue = confirm("Do you want to save?);
}
else
...{
alert("No need to save because of no field modified.");
retvalue = false
}
return retvalue;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="txtTest" runat="server" Width="80px"></asp:TextBox>
<asp:RegularExpressionValidator ID="RegularExpressionValidator4" runat="server" ControlToValidate="txtTest"
ErrorMessage="Test must be Numeric" ValidationExpression="^[0-9]{1,28}.?[0-9]{0,4}$">*</asp:RegularExpressionValidator>
<asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="return SubmitDetailModified()" />
<asp:ValidationSummary ID="ValidationSummary1" runat="server" ShowMessageBox="true" ShowSummary="false" />
</div>
</form>
</body>
上面的意圖是,在點擊按鈕的時候彈出一個確認框,如果選擇是則繼續回傳,否則阻止回傳。在回傳過程中如果某個欄位的驗證不通過,ValidationSummary 應該彈出訊息框來阻止該回傳.
但是事與願違,當我單擊按鈕的時候,如果選擇‘否’,阻止回傳,正常。
但當我選擇‘是’的時候,有兩種情況:
1. 所有欄位的驗證都通過,然後點擊‘是’,頁面繼續回傳,一切正常。
2. 當有欄位的驗證不通過的時候,點擊‘是’,驗證訊息不會彈出來,而且頁面會繼續回傳,導致操作資料不正確。
為什麼驗證訊息框會彈不出來呢?
後來,瞭解到.net驗證控制項的機制就是通過javascript來返回true或false來控制頁面是否回傳的。在上面的代碼中,如果選擇‘是’,直接在按鈕的點擊事件中返回true,頁面當然要回傳了。後來發現驗證控制項是通過給event.returnValue=true/false來實現阻止與否的。於是我改寫了My Code如下:
<head runat="server">
<title>Untitled Page</title>
<script language="javascript" type="text/javascript">
var IsDetailsModifed = true
function SubmitDetailModified()
...{
var retvalue;
if (IsDetailsModifed == true)
...{
retvalue = confirm("Do you want to save ?");
}
else
...{
alert("No need to save because of no field modified.");
retvalue = false
}
if (retvalue == false)
...{
event.returnValue = retvalue;
}
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="txtTest" runat="server" Width="80px"></asp:TextBox>
<asp:RegularExpressionValidator ID="RegularExpressionValidator4" runat="server" ControlToValidate="txtTest"
ErrorMessage="Test must be Numeric" ValidationExpression="^[0-9]{1,28}.?[0-9]{0,4}$">*</asp:RegularExpressionValidator>
<asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="SubmitDetailModified()" />
<asp:ValidationSummary ID="ValidationSummary1" runat="server" ShowMessageBox="true" ShowSummary="false" />
</div>
</form>
</body>
如果我選擇'是',我什麼都不做,那就是預設的繼續回傳,但是如果有驗證不通過的欄位,驗證控制項通過event.returnValue=false來阻止頁面繼續回傳,這樣頁面就會跳出驗證不通過的對話方塊。如果我選擇‘否’,我也用event.returnValue=false的方法來阻止頁面回傳。這樣的話,就達到了最初的目的。
總結:
在使用.net的驗證控制項的時候,不要再事件中直接return true or false,而是通過event.returnValue=true/false來實現頁面的回傳阻止。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/kucool/archive/2008/02/27/2124024.aspx