Array must contain 1 element
I have the following class:
public class CreateJob
{
[Required]
public int JobTypeId { get; set; }
public string RequestedBy { get; set; }
public JobTask[] TaskDescriptions { get; set; }
}
I'd like to have a data annotation above TaskDescriptions
so that the array must contain at least one element? Much like [Required]
. Is this possible?
It can be done using standard Required and MinLength validation attributes, but works ONLY for arrays:
public class CreateJob
{
[Required]
public int JobTypeId { get; set; }
public string RequestedBy { get; set; }
[Required, MinLength(1)]
public JobTask[] TaskDescriptions { get; set; }
}
I've seen a custom validation attribute used for this before, like this:
(I've given sample with a list but could be adapted for array or you could use list)
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<Person> TaskDescriptions { get; private set; }
// as of C# 8/9 this could be more elegantly done with
public class MustHaveOneElementAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
return value is IList {Count: > 0};
}
}
Credit to Antonio Falcão Jr. for elegance
Please allow me a side note on using MinLengthAttribute with .NET Core.
Microsoft recommends using Razor Pages starting with .NET Core 2.0.
Currently, The validation with MinLengthAttribute on a property within the PageModel does not work:
[BindProperty]
[Required]
[MinLength(1)]
public IEnumerable<int> SelectedStores { get; set; }
ModelState.IsValid returns true when SelectedStores.Count() == 0.
Tested with .NET Core 2.1 Preview 2.