【问题标题】:Can't seem to set Custom Validation Attribute ErrorMessage似乎无法设置自定义验证属性 ErrorMessage
【发布时间】:2014-04-10 18:50:58
【问题描述】:

我为我的 MVC 项目创建了一个自定义验证属性,以允许我基于动态范围进行验证:

public class DynamicRangeAttribute : ValidationAttribute
{
    private readonly double _min;
    private readonly double _max;

    ...

    private DynamicRangeAttribute(double? min, double? max, string minProperty, string maxProperty)
    {
        _min = min ?? (double)GetValue<Decimal>(this, minProperty);
        _max = max ?? (double)GetValue<Decimal>(this, maxProperty);
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {

        return new RangeAttribute(_min, _max).IsValid(value) ? ValidationResult.Success
            : new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
    }

    public override string FormatErrorMessage(string name)
    {
        return string.Format("{0} must be between {1} and {2}", name, _min, _max);
    }

    ...
}

GetValue() 使用反射来查找提供的字段的值。

这里是实现属性的地方:

[Display(Name = @"Chosen Amount")]
    [DynamicRange(0, "CurrentBalance")]
    public decimal ChosenAmount { get; set; }

验证本身效果很好,但 ErrorMessage 不匹配。理论上,它应该显示(例如)“Chosen Amount must be between 0 and 2500”或任何当前余额。相反,我得到了这个:

这不仅与我的自定义错误消息不匹配,而且与默认的 Range 错误消息也不匹配(另外,请注意它提取的是字段的实际名称而不是 DisplayName)。只是为了测试它,我尝试在 IsValid 方法中手动执行验证(本质上是 return _min ),以防 Range 属性以某种方式覆盖,没有骰子。

我现在唯一的理论是它与我们格式化字段的方式有关:我们使用 javascript 将值屏蔽为货币,因此 2500 变为 $2500.00,而 -5 变为 ($5.00)。我还没有尝试禁用此功能(这是我的下一步),但我希望有人之前可能遇到过此问题并可以提供更好的解决方案。

谢谢,

  • 杰西

【问题讨论】:

    标签: javascript asp.net-mvc validation custom-attributes


    【解决方案1】:

    此错误消息与您的自定义验证属性无关。显示它是因为您的 decimal 字段的 number 验证失败。一旦您使用 $ 符号屏蔽您的输入,它就不能再被视为有效数字,因此您会看到错误。

    要解决此问题,请停止屏蔽此字段或删除 number 验证规则:

    $("#input").rules("remove", "number");
    

    您还应该注意,如果您以$xxx 格式发布此字段,服务器验证也会失败,因为DefaultModelBinder 将无法将其转换为decimal 类型。在这种情况下,您必须为 decimal 创建自己的模型绑定器。

    【讨论】:

    • 该死,这就是我害怕的。不过,感谢您确认。是时候去做更多的研究了!
    • 虽然值得一提的是,如果我输入的数字在所需范围内,它将通过验证并毫无问题地提交。
    猜你喜欢
    • 2013-01-29
    • 1970-01-01
    • 2018-08-14
    • 2011-05-15
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 2013-01-25
    相关资源
    最近更新 更多