【发布时间】:2021-07-09 22:01:30
【问题描述】:
我有一个带有 Id 属性的视图模型
[Required]
public int Id { get; set; }
但我认为这个属性只适用于字符串属性。
不设置Id时,Id为0,模型有效。
如果没有为 int 属性设置值,我如何强制执行该模型将无效?
【问题讨论】:
标签: asp.net-mvc data-annotations
我有一个带有 Id 属性的视图模型
[Required]
public int Id { get; set; }
但我认为这个属性只适用于字符串属性。
不设置Id时,Id为0,模型有效。
如果没有为 int 属性设置值,我如何强制执行该模型将无效?
【问题讨论】:
标签: asp.net-mvc data-annotations
使用Range 属性。
将最小值设置为 1,将最大值设置为 int.MaxValue
[Range(1, int.MaxValue, ErrorMessage = "Value for {0} must be between {1} and {2}.")]
【讨论】:
> 0,这在当前和/或项目的未来可能不可行...真的不要'不要这样做!
将类型更改为Nullable<int>(快捷方式int?)以允许null 值。
【讨论】:
对于 .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.MaxValue,API 也会默认在达到此值之前返回此错误+ 1:
The JSON value could not be converted to System.Int32
【讨论】:
这类似于@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;
【讨论】:
如果您使用的是数据库,则应使用属性[Key] 和[DatabaseGenerated(DatabaseGenerated.Identity)] 和Id 不应为NULLABLE。
【讨论】: