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

我希望只允许在某个字段中的值大于0时才提交表单。我想也许 Mvc Range 属性只允许我输入1个值来表示只有一个大于 test,但是没有运气,因为它坚持使用最小值和最大值。

有什么办法可以做到这一点吗?

123404 次浏览

您不能存储大于底层数据类型所能容纳的数字,因此 Range 属性需要一个 max 值的事实是一件非常好的事情。请记住,在现实世界中并不存在,因此下面的代码应该起作用:

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

我发现这个答案是为了验证 float/double 的任何正值。事实证明,这些类型对于“ Epsilon”有一个有用的常量

表示最小的正系统。大于零的双精度值。

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

您可以像这样创建自己的验证程序:

    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; }

我通常在下拉验证中使用它。注意,因为它扩展了 validationtribute,所以可以使用一个参数定制错误消息。

上面的验证器处理整数,我把它扩展为处理小数:

    public class RequiredDecimalGreaterThanZero : 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
decimal i;
return value != null && decimal.TryParse(value.ToString(), out i) && i > 0;
}
}