在 asp.net 中使用验证组

Use of Validation Group in asp.net

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

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

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

我的代码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>

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;" />

现在我们仅在用户未确认操作时 return false(阻止提交),否则将调用脚本的其余部分从而触发验证。

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

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

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