使用MVC和数据注释在客户端添加大于0的验证器的最佳方法是什么?


92

我希望仅在某个字段中的值大于0时才允许提交表单。我认为Mvc Range属性可能只允许输入1值来表示仅大于test,但是它坚持最低和最高值,因此没有运气。

有什么想法可以实现吗?

Answers:


241

您存储的数字不能大于基础数据类型可以容纳的数字,因此Range属性需要最大值的事实是一件非常好的事情。请记住,这在现实世界中并不存在,因此以下方法应该起作用:

[Range(1, int.MaxValue, ErrorMessage = "Please enter a value bigger than {1}")]
public int Value { get; set; }

这种方法的缺点是,如果它验证“ abcd”,它将显示:Please enter a value less than or equal to 2147483647
Mike Cole

您应该无法在数字字段中输入字母。我的问题是,如果我输入9999999999999999999,它说我的电话号码太小。
John Lord

12

我发现此答案希望验证浮点数/双精度数的任何正值。事实证明,这些类型对于'Epsilon'具有有用的常量

表示大于零的最小正System.Double值。

    [Required]
    [Range(double.Epsilon, double.MaxValue)]
    public double Length { get; set; }

Epsilon实际上是演算函数。它是一个“限制”功能,基本上说“可以区分为零的最小数字”,因此您最终可以输入.00000001。我会在分钟数上加上一个实际数字。
约翰·罗德,

9

您可以这样创建自己的验证器:

    public class RequiredGreaterThanZero : ValidationAttribute
{
    /// <summary>
    /// Designed for dropdowns to ensure that a selection is valid and not the dummy "SELECT" entry
    /// </summary>
    /// <param name="value">The integer value of the selection</param>
    /// <returns>True if value is greater than zero</returns>
    public override bool IsValid(object value)
    {
        // return true if value is a non-null number > 0, otherwise return false
        int i;
        return value != null && int.TryParse(value.ToString(), out i) && i > 0;
    }
}

然后将该文件包含在模型中,并将其用作如下属性:

    [RequiredGreaterThanZero]
    [DisplayName("Driver")]
    public int DriverID { get; set; }

我通常在下拉验证中使用它。请注意,由于它扩展了validationattribute,因此可以使用参数来自定义错误消息。


1
我最终将此答案用于确实需要自定义验证器的另一种情况。对于大于零的简单整数验证,应使用Darin的答案。
扎克

我实际上也很喜欢他的方法,但是与我一起工作的人对“任意设置值的限制”存在问题。
约翰·罗德,

哈,那似乎很奇怪。如果有效范围小于最大整数大小,我可以看到他们的推理。
扎克

小数问题更多。不看,我敢肯定,一个没有min或内置的最大功能。
约翰·洛

这对我来说是最好的解决方案!
Dave Stuart
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.