在asp.net中使用验证组

时间:2015-07-09 06:58:53

标签: c# asp.net requiredfieldvalidator

我不能不在asp.net c#中使用验证组。

我在Google搜索了解决方案但没有成功。

在这个简单的形式asp.net中,即使值为null或值不是数字,TextBox pcs 也始终有效。

我的代码asp.net如下,有什么问题?

HTML:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>

            <asp:TextBox ID="pcs" runat="server" Width="100" CssClass="ddl_Class" ValidationGroup="First"></asp:TextBox>

            <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="pcs"
                ErrorMessage="PCS !" Text="***" Display="None" ValidationGroup="First"></asp:RequiredFieldValidator>

            <asp:RegularExpressionValidator ID="RegularExpressionValidatorPcs" runat="server" ControlToValidate="pcs"
                ErrorMessage="PCS only number" Text="***" Display="None" ValidationExpression="^\d+$" ValidationGroup="First"></asp:RegularExpressionValidator>

            <asp:ImageButton ID="btnSave" runat="server" ImageUrl="/Images/save_button.gif" OnClientClick="return confirm('Confirm ?');" ValidationGroup="First" CausesValidation="true" />

            <asp:ValidationSummary ID="First" runat="Server" ShowMessageBox="true" />

        </div>
    </form>
</body>
</html>

编辑1

问题是OnClientClick事件。

如果在asp中删除此事件:ImageButton验证组正常工作。

为什么?

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>

            <asp:TextBox ID="pcs" runat="server"></asp:TextBox>

            <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="pcs"
                ErrorMessage="PCS !" Text="***" Display="Dynamic"></asp:RequiredFieldValidator>

            <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ControlToValidate="pcs"
                ErrorMessage="PCS only number" Text="***" Display="None" ValidationExpression="^\d+$" EnableClientScript="true"></asp:RegularExpressionValidator>

            <asp:ImageButton ID="btnSave" runat="server" ImageUrl="/Images/save_button.gif" />

        </div>

        <asp:ValidationSummary ID="First" runat="Server"
            ShowMessageBox="true" />

    </form>
</body>
</html>

1 个答案:

答案 0 :(得分:1)

OnClientClick是ASP.NET 2.0中引入的一个有用属性,它允许我们向按钮控件添加一些客户端行为。使用就像在用户点击按钮时提供要调用的脚本一样简单:

<asp:Button runat="server" ID="Save" 
    OnClientClick="return confirm('Are you sure?');" />

问题是,如果你这样使用它,客户端验证不会被激发。查看呈现的HTML可以快速解释这种情况:

onclick="return confirm('Are you sure?');WebForm_DoPostBackWithOptions(...)"

正如您所看到的,验证甚至没有机会发射(在调用WebForm_DoPostBackWithOptions时会发生这种情况。)

解决问题很简单(或不)。所有必须做的就是我们的OnClientClick脚本(在Internet上某处找到的一段代码)稍作改动:

<asp:Button runat="server" ID="Save" 
    OnClientClick="if (!confirm('Are you sure?')) return false;" />

现在我们只返回false(阻止提交),以防用户没有确认操作,否则,将调用脚本的其余部分,从而触发验证。

我之所以说这可能不是一个简单的问题的原因是验证发生在确认之后,这在我看来并不是最好的。如果表单上仍有错误,为什么要求用户保存他的数据,我们会在确认他要保存后通知他?

经过分析,负责处理OnClientScript的代码,我得出结论,解决这个问题不是一件容易的事。在显示确认对话框之前,它需要服务器端的一些脏黑客才能使其漂亮或在客户端上调用验证例程(请记住,在这种情况下检查是否存在验证例程)。

使用自:http://vaultofthoughts.net/OnClientClickBreaksValidation.aspx