【问题标题】:Allowed Values of field in ASP.NETASP.NET 中字段的允许值
【发布时间】:2021-03-17 03:46:50
【问题描述】:

对于 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; }

    }

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

【问题讨论】:

  • 如果您不将其显示为下拉列表,您可以将检查约束添加到您的数据库。 stackoverflow.com/a/11981892/2084315
  • 如果您只有两个选项,我会将其存储为布尔值。如果你真的需要它,你可以有一个只读属性,将值作为字符串返回。如果您有 3 个值,则枚举将是另一个具有外键的表。

标签: c# asp.net asp.net-mvc asp.net-core data-annotations


【解决方案1】:

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

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

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`);
    }
}

然后在你的模型中:

public class Employee
{
    ...

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

    ...
}

【讨论】:

  • 好答案,但我相信构造函数你想写_allowedValues = allowedValues;而不是_args = allowedValues;
  • 糟糕,谢谢@Max!我更新了我的答案。我最初称它为 _args 并忘记更改它的实例。
  • 我对此还有另一个问题。如何在视图的下拉列表中访问它?
【解决方案2】:

您也可以使用以下正则表达式来执行此操作:

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

更多详情可以通过here找到

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-10
    • 2010-10-02
    • 2017-03-14
    • 2021-01-23
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    相关资源
    最近更新 更多