数组必须包含1个元素

我有以下课程:

public class CreateJob { [Required] public int JobTypeId { get; set; } public string RequestedBy { get; set; } public JobTask[] TaskDescriptions { get; set; } } 

我想在TaskDescriptions上面有一个数据注释,以便数组必须包含至少一个元素? 很像[Required] 。 这可能吗?

我之前看过一个自定义validation属性,如下所示:

(我给了一个带有列表的样本,但可以适用于数组,或者你可以使用列表)

 public class MustHaveOneElementAttribute : ValidationAttribute { public override bool IsValid(object value) { var list = value as IList; if (list != null) { return list.Count > 0; } return false; } } [MustHaveOneElementAttribute (ErrorMessage = "At least a task is required")] public List TaskDescriptions { get; private set; } 

它可以使用标准的MinLengthAttributevalidation属性来完成,但仅适用于数组:

 public class CreateJob { [Required] public int JobTypeId { get; set; } public string RequestedBy { get; set; } [MinLength(1)] public JobTask[] TaskDescriptions { get; set; } } 

这是@dove解决方案的一个改进版本,它处理不同类型的集合,如HashSet,List等…

 public class MustHaveOneElementAttribute : ValidationAttribute { public override bool IsValid(object value) { var collection = value as IEnumerable; if (collection != null && collection.GetEnumerator().MoveNext()) { return true; } return false; } } 

请允许我在使用MinLengthAttribute和.NET Core时附注。

Microsoft建议使用从.NET Core 2.0开始的Razor页面。

目前,使用MinLengthAttribute对PageModel中的属性进行validation不起作用:

 [BindProperty] [Required] [MinLength(1)] public IEnumerable SelectedStores { get; set; } 

SelectedStores.Count()== 0时,ModelState.IsValid返回true。

使用.NET Core 2.1 Preview 2进行测试。

如果值为null,则MinLength属性将该值视为有效。 因此,只需将模型中的属性初始化为空数组即可。

 MinLength(1, ErrorMessageResourceName = nameof(ValidationErrors.AtLeastOneSelected), ErrorMessageResourceType = typeof(ValidationErrors))] int[] SelectedLanguages { get; set; } = new int[0];