整数值的必需属性

我有一个具有 Id 属性的视图模型

[Required]
public int Id { get; set; }

但是我认为这个属性只适用于字符串属性。

当没有设置 Id 时,Id 的值为0,并且模型是有效的。

如果没有为 int 属性设置值,那么模型将是无效的,我如何强制执行这一点呢?

45673 次浏览

将类型更改为 Nullable<int>(快捷方式 int?)以允许 null值。

使用 Range属性。

将最小值设置为1,最大值设置为 int.MaxValue

[Range(1, int.MaxValue, ErrorMessage = "Value for {0} must be between {1} and {2}.")]

为了。NET Core (也许是更早的版本)你也可以创建一个自定义属性来执行范围验证,以方便重用:

public class Id : ValidationAttribute
{
protected override ValidationResult IsValid(
object value,
ValidationContext validationContext)
{
return Convert.ToInt32(value) > 0 ?
ValidationResult.Success :
new ValidationResult($"{validationContext.DisplayName} must be an integer greater than 0.");
}
}

在模型中像这样使用 Id 属性:

public class MessageForUpdate
{
[Required, Id]
public int UserId { get; set; }
[Required]
public string Text { get; set; }
[Required, Id]
public int ChannelId { get; set; }
}

当 Id 为 <= 0时,将返回此错误消息:

UserId must be an integer greater than 0.

无需验证该值是否小于 int。MaxValue (尽管在消息中显示这个值很不错) ,因为即使该值为 int,缺省情况下 API 也会返回这个错误。MaxValue + 1:

The JSON value could not be converted to System.Int32

如果您使用的是数据库,那么应该使用属性 [Key][DatabaseGenerated(DatabaseGenerated.Identity)],而 Id不应该是 NULLABLE

这类似于@Lee Smith 的答案,但是使0成为有效的输入,这在某些场景中可能很有用。

你能做的就是把 int 值初始化为另一个值,然后是0,像这样:

[Range(0, int.MaxValue)]
public int value{ get; set; } = -1;

它甚至可以支持除 int. MinValue 之外的所有值,方法如下:

[Range(int.MinValue + 1, int.MaxValue)]
public int value{ get; set; } = int.MinValue;