【问题标题】:ASP.NET display one message for multiple validatorsASP.NET 为多个验证器显示一条消息
【发布时间】:2014-05-22 16:32:22
【问题描述】:

让我首先说明我真正想做的事情:我必须检查一个字段是否有多个“独占”(我会解释)标准,并显示一条验证消息。

这是我的代码:

<asp:TextBox ID="Amount" runat="server" CssClass="field"></asp:TextBox>
<asp:RequiredFieldValidator Text="Amount is required"/>
<asp:CompareValidator Operator="DataTypeCheck" Type="Currency" Text="Amount must be numeric"/>
<asp:CompareValidator Operator="GreaterThanEqual" ValueToCompare="10" Type="Currency" Text="Minimum donation $10.00"/>
<asp:CompareValidator Operator="LessThan" ValueToCompare="10000" Type="Currency" Text="Wow that's too much"/>

为了便于阅读,我省略了一些标签 - 所有验证器都在同一个验证组中,它们都有 ID,ControlToValidate="Amount" Display="Dynamic"

如果“金额”字段为空白,或其中包含数字,则一切正常。但是,如果我在字段中输入文本:

即使 10,000 和 DataTypeCheck 应该是互斥的,但字符串上的数字比较失败。

我意识到我可以为此使用 CustomValidator,但我希望最终在其单独的 &lt;span&gt; 元素中以不同的方式设置消息的样式。

所以,我的错误(因为它们不是“我真正想做什么?”)的问题是:

  1. 如何使货币类型的CompareValidator 在文本上不失败?
  2. 如何只显示来自多个验证器的第一条消息?
  3. 我该如何做我想做的事?

【问题讨论】:

  • 看起来 CustomValidator 毕竟是您的最佳选择。唯一能阻止你的是一条消息的外观不同 - 它很容易弄清楚。

标签: asp.net validation webforms


【解决方案1】:
$(document).ready(function() {
$("#txtboxToFilter").keydown(function(event) {
    // Allow only backspace and delete
    if ( event.keyCode == 46 || event.keyCode == 8 ) {
        // let it happen, don't do anything
    }
    else {
        // Ensure that it is a number and stop the keypress
        if (event.keyCode > 48 || event.keyCode < 57 ) {
            event.preventDefault(); 
        }   
    }
});

});

另外,如果您使用的是 HTML5,您可以简单地使用

EDIT 1 更正了比较运算符以允许数字 0-9。

【讨论】:

  • 我尝试添加type="number",但浏览器最终使用了自己的样式(旋转计数器,红色发光边框无效)
  • 我认为这更像是一种解决方法,但它确实有效。我不得不为 DataTypeCheck 留下验证器,因为总有办法解决这个问题。 This SO question 对要包含的 keyCode 有更详细的说明。
【解决方案2】:

所以我最终使用了CustomValidator 并在我想要我的不同信息的地方设置了一个标签。

.aspx 页面:

<span>
    <asp:TextBox ID="Amount" runat="server" CssClass="field"></asp:TextBox>
    <asp:RequiredFieldValidator [same as earlier...] />
    <asp:CustomValidator ID="AmountCustomValidator" ControlToValidate="Amount" ValidateEmptyText="False" OnServerValidate="AmountCustomValidator_ServerValidate"/>
</span>
<span>
    <asp:Label ID="AmountTooMuchMessage" runat="server" Text="" />
</span>

代码隐藏:

protected void AmountCustomValidator_ServerValidate(object source, ServerValidateEventArgs args)
{
    args.IsValid = true;
    AmountTooMuchMessage.Text = ""; //Reset special error label text

    decimal amountFormatted;

    if (!decimal.TryParse(args.Value, out amountFormatted))
    {
        AmountCustomValidator.Text = "Amount must be numeric";
        args.IsValid = false;
        return; //Don't try to compare values to non-numeric input
    }

    //This is money, so make it two decimals
    amountFormatted = Math.Round(amountFormatted, 2);
    Amount.Text = amountFormatted.ToString();

    if (amountFormatted < 10)
    {
        AmountCustomValidator.Text = "Minimum donation $10.00";
        args.IsValid = false;
    }

    if (amountFormatted > 10000)
    {
        AmountCustomValidator.Text = "";
        AmountTooMuchMessage.Text = "That's too much";
        args.IsValid = false;
    }
}

请注意,我必须删除CustomValidator 上的ErrorMessage 标记,否则它会在Text="" 时显示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 2021-08-29
    • 2013-04-03
    • 1970-01-01
    相关资源
    最近更新 更多