ASP.NET 中字段的允许值

Adi*_*Adi 1 c# asp.net asp.net-mvc data-annotations asp.net-core

ASP.NET MVC Core 中的允许值是否有任何数据注释?由于 SQL 服务器中没有枚举,因此我无法将包含枚举字段的类迁移到数据库。我想为班级中的字段提供可能/允许的值。有没有办法做到这一点?

    public class Employee
    {
        [Key]
        public int ID { get; set; }

        [Required]
        public string Name { get; set; }

        [Required]
        public string Status { get; set; }

    }
Run Code Online (Sandbox Code Playgroud)

我想提供ActiveInactive作为 Status 字段的唯一可能值。

Ari*_*ris 8

您还可以使用正则表达式来执行此操作,如下所示:

[Required]
[RegularExpression("Active|Inactive", ErrorMessage = "Invalid Status")]
 public string Status { get; set; }
Run Code Online (Sandbox Code Playgroud)

更多详细信息可以在这里找到


Mat*_*t U 5

正如@ps2goat 提到的,您可以对数据库使用检查约束。但是,对于进入 API 的模型,您可能仍然希望在那里提供验证。理想情况下,您将在合理范围内尽一切可能防止不良数据进入数据层。您没有提及是否使用 n 层架构,或者您的控制器是否直接引用数据模型。无论哪种方式,我相信这个自定义属性可以在 API 层或实体模型上使用。

是一个很好的答案,解释了如何创建自定义验证属性。这是一个旧答案,但它仍然适用于 .Net Core。而这里是在对.NET核心定义验证属性的答案。它基本上是这样的:

public class EmployeeStatusAttribute : ValidationAttribute
{
    private string[] _allowedValues;

    public EmployeeStatusAttribute(string[] allowedValues)
    {
        _allowedValues = allowedValues;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var employee = value as Employee;
        if (_allowedValues.Contains(employee.Status))
        {
            return ValidationResult.Success;
        }
        return new ValidationResult(`{employee.Status} is not a valid status`);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的模型中:

public class Employee
{
    ...

    [EmployeeStatus("Active", "Inactive")]
    public string Status { get; set; }

    ...
}
Run Code Online (Sandbox Code Playgroud)