我是 .NET 的新手,我一直在努力使用 Enum 作为数据注释来验证我的请求。我花了一整天的时间来解决大部分问题,但我不相信我的解决方案是好的做法。
我的目标是对 FormBody 属性实现验证,其中该属性的类型是 Enum。
这是枚举的示例:
public enum Color
{
Red,
Green,
Blue
}
现在,为了简化问题,我有两个使用这种颜色的模型。我们称它们为 Car 和 CarDtoRequest。
在CarDtoRequest中,用作FromBody的类型,它看起来像这样:
public class CarDtoRequest
{
[Required]
[EnumDataType(typeof(Color), ErrorMessage = "Color must be either 'Red', 'Green', or 'Blue'")]
public string Color { get; set; }
}
另外,实际的 Car 类型类如下所示:
public class Car
{
[Column(TypeName = "nvarchar(50)")]
public Color Color { get; set; }
}
我的第一个问题是,我花了 3-4 个小时,但我仍然无法将动态字符串分配到连接 Color 中所有值的 ErrorMessage 中(任何非静态字符串都会显示错误:CS0182:属性参数必须是属性参数类型的常量表达式、typeof 表达式或数组创建表达式)。
另外,我迁移到DbContext类中的数据库如下:
public DbSet<Car> Cars { get; set; }
验证有效,并且仅当 FromBody 颜色是枚举值之一时才有效。此外,它将它作为字符串保存在数据库中,但在我的代码中,它仍然保存为数字。
我正在使用 AutoMapper 从域模型转换为 DTO 模型,反之亦然。
然而,所有这一切似乎都不是好的做法和专业的。任何改进建议将不胜感激。
尝试自定义获取/设置
public class Car
{
private Color c { get; set; }
public string Color {
get { return c.ToString(); }
set { c = (Color)Enum.Parse(typeof(Color), value);
}
}