【问题标题】:How to use Data Annotations to validate a nullable int如何使用数据注释来验证可为空的 int
【发布时间】:2017-08-11 23:18:57
【问题描述】:

在一个 MVC 5 项目中,我有一个可以为空的 int 模型。由于可能无法解释的原因,它必须是可为空的 int 且不能是字符串。

// Value can be null or an integer from 0 to 145        
[Range(0,145)]
public int? Criterion { get; set; }

预期的注释是在表单中输入值时提供用户反馈。

Criterion: @Html.TextBoxFor(m => m.Criterion)
<span class="text-danger">@Html.ValidationMessageFor(m => m.Criterion)</span>

虽然用户在输入非整数值时会收到反馈,但 Range 属性似乎不起作用。

为了强制执行一个可为空的整数范围,我需要使用正则表达式,还是有更简单的方法来强制执行规则?

【问题讨论】:

  • [Range(typeof(int), "0", "145", ErrorMessage = "必须是整数值 0-145。")]
  • 我认为添加正则表达式允许数字和空格是一个相当简单的解决方案。
  • @Nathan_Sav -- 我试过没有发生验证。

标签: c#


【解决方案1】:

如果我没记错的话,[Range] 数据注释应该对可空整数按预期工作(即,它只会验证一个数字是否在该范围内,如果存在的话)。您需要确保在 POST 操作中调用 ModelState.IsValid 才能触发此服务器端验证。

示例

以下示例演示了使用null-11150 作为输入值及其预期结果:

你可以see an example demonstrating this here

【讨论】:

  • 您正在使用字符串。我的模型是一个可为空的 int。
  • 糟糕,错字了。我已将示例更新为使用 int?,它应该仍然可以按预期工作。
  • 我发现它确实适用于您的情况。对于我的 BeginForm,我没有发布我的 ViewModel:我正在提交用于过滤我的 ViewModel 的值,所以我认为这不会适用。
  • 同样的基本思想也适用。您不一定需要发布到同一个 ViewModel,您可以创建一个 FilteringModel 类并在其上设置适当的属性并以这种方式处理它,如果它更有意义的话。
【解决方案2】:

我知道这很旧,但我今天遇到了同样的情况,以防其他人遇到同样的问题,您需要知道 Range 不会验证 null 值,但您可以将其与 Required 一起使用为了使验证成为可能,它将是:

[Required, Range(0, 145)]
public int? Criterion  { get; set; }

这是一个基于 Rion 小提琴的示例:https://dotnetfiddle.net/SBoqJA

【讨论】:

  • 这应该被标记为正确答案,因为正如@nramirez 所说,Range 验证属性不考虑null 值。无论如何,这样做仍然存在该值必须填充的问题,因为它是必需的。在为具有 swagger 接口的 Web API 创建模型时,我遇到了同样的问题。 swagger UI 在字段上添加强制指示符*
【解决方案3】:

您可以通过继承 ValidationAttributeIClientValidatable 来创建自定义数据注释来轻松完成此操作。

public class ValidateNullableInt : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        return IsValid(value != null ? value : null)
    }

    public override ValidationResult IsValid(object value, ValidationContext context)
    {
        bool isValid = false;
        if(typeof(value) == Nullable<int>)
        {
            int? temp = value as Nullable<int>;

            if(temp.HasVaue > minValue && temp.HasValue < maxValue)
            {
                return ValidationResult.Success;
            }

            return new ValidatonResult(errorMessage);
        }
    }
}

【讨论】:

  • 这些函数应该放在哪里?
  • 用你想要的任何名称创建一个文件夹,我使用DataAnnotationExtensions。然后,使用您想要的任何名称创建一个名为ValidateNullableInt 的类可能会起作用。完成所有操作后,只需将其用作常规数据注释即可。可能还需要在控制器中添加using myProjectName.DataAnnotationExtensions
猜你喜欢
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多