数组必须包含1个元素

Cal*_*ass 27 .net c# asp.net-mvc model-validation asp.net-mvc-3

我有以下课程:

public class CreateJob
{
    [Required]
    public int JobTypeId { get; set; }
    public string RequestedBy { get; set; }
    public JobTask[] TaskDescriptions { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

Sat*_*Sat 47

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

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

  • 关于此属性的更多信息:您应该将[Required]与[MinLength(1)]结合使用,因为如果数组为null(非空,null),MinLength将不会触发.同样重要的是要注意,默认的客户端验证器不支持(如果我错了,请更正).它只会触发ModelState.IsValid. (11认同)
  • “[MinLength(1)]”与 ASP.NET Core 中的“IEnumerable<T>”配合使用 (7认同)

dov*_*ove 24

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

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

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; }
Run Code Online (Sandbox Code Playgroud)

  • 从 C# 8/9 开始,所有这些代码都可以替换为:`返回值是 IList {Count: &gt; 0};` (2认同)

myn*_*kow 6

这是@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;
    }
}
Run Code Online (Sandbox Code Playgroud)


Sve*_*ven 5

请允许我在 .NET Core 中使用 MinLengthAttribute 的旁注。

Microsoft 建议从 .NET Core 2.0 开始使用 Razor Pages。

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

[BindProperty]
[Required]
[MinLength(1)]
public IEnumerable<int> SelectedStores { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

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

  • [MinLength(1)] 属性满足我的要求,即使用 .NET 6 Blazor 在 List&lt;T&gt; 中至少有 1 个元素。 (2认同)