【发布时间】:2009-08-17 20:41:16
【问题描述】:
我在表单上有一个按钮,可以将唯一值保存到我的数据库中,为了防止用户提交两次并收到错误,我添加了一些 JavaScript 逻辑,以便在单击按钮后在客户端禁用该按钮。从功能上讲,这一切都有效,但它产生了一个意想不到的副作用,即字段 Validation 在一个控件上被触发,该控件具有与我提交的完全不同的验证组。如果我删除我的自定义 OnClick 属性,则页面的行为将再次正常。如果您查看this article 中的第 3 项,您会发现其他人也注意到了这个问题。
仔细测试问题后,我注意到确切的问题是在客户端中将按钮更改为disabled = true 的结果。鉴于这种困境,我不得不求助于服务器端解决方案来解决我面临的问题,但我不禁想知道为什么会发生这种情况。这是 ASP.NET 中的错误吗?
如果您想确切了解发生了什么,这里是an example,这里是代码:
<%@ Page Language="C#" %>
<script runat="server" language="C#">
void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.Button1.Attributes["onclick"] = string.Format("DisableOnSubmit('{0}','{1}');", this.Button1.ClientID, this.Button1.ValidationGroup);
}
}
</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
function DisableOnSubmit(btn, group) {
if (btn && group) {
if (Page_ClientValidate(group)) {
var btnElement = document.getElementById(btn);
if (btnElement) {
btnElement.disabled = true;
btnElement.value = 'Saving...';
}
}
}
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server" ValidationGroup="group1">Initial Value</asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="This should come up if the first field is empty."
ValidationGroup="group1" ControlToValidate="TextBox1"></asp:RequiredFieldValidator>
<asp:Button ID="Button1" runat="server" Text="Click Me!" ValidationGroup="group1" />
<br />
<br />
<asp:TextBox ID="TextBox2" runat="server" ValidationGroup="group2"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ErrorMessage="You shouldn't ever see me."
ValidationGroup="group2" ControlToValidate="TextBox2"></asp:RequiredFieldValidator>
</div>
</form>
</body>
</html>
【问题讨论】:
-
This answer 有很好的解释。
标签: javascript asp.net validation