45

私は次のクラスを持っています:

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

TaskDescriptions配列に少なくとも1つの要素が含まれている必要があるように、上記のデータ注釈が必要ですか?のように[Required]。これは可能ですか?

4

8 に答える 8

71

これは、標準のRequiredおよびMinLength検証属性を使用して実行できますが、配列に対してのみ機能します。

public class CreateJob
{
    [Required]
    public int JobTypeId { get; set; }
    public string RequestedBy { get; set; }
    [Required, MinLength(1)]
    public JobTask[] TaskDescriptions { get; set; }
}
于 2013-05-19T12:31:52.200 に答える
32

これに使用されるカスタム検証属性は、次のように以前に見たことがあります。

(私はリスト付きのサンプルを提供しましたが、配列に適合させることも、リストを使用することもできます)

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

エレガンスのためのAntonioFalcãoJr。の功績

于 2012-11-13T13:31:37.923 に答える
6

.NETCoreでのMinLengthAttributeの使用に関する補足説明をお願いします。

.NETCore2.0以降のRazorPagesを使用することをお勧めします。

現在、PageModel内のプロパティに対するMinLengthAttributeによる検証は機能しません。

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

ModelState.IsValidは、SelectedStores.Count()==0の場合にtrueを返します。

.NET Core 2.1Preview2でテスト済み。

于 2018-04-12T08:45:42.363 に答える
6

これは、HashSet、Listなどのさまざまなタイプのコレクションを処理する@doveソリューションの少し改善されたバージョンです...

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;
    }
}
于 2018-06-01T10:10:18.767 に答える
3

2つの標準注釈属性を使用する必要があります

public class CreateJob
{
    [MaxLength(1), MinLength(1)]
    public JobTask[] TaskDescriptions { get; set; }
}
于 2020-11-26T16:27:49.850 に答える
1

mynkowの回答に加えて、属性に最小カウント値を渡し、意味のある失敗メッセージを生成する機能を追加しました。

public class MinimumElementsRequiredAttribute : ValidationAttribute
{
  private readonly int _requiredElements;

  public MinimumElementsRequiredAttribute(int requiredElements)
  {
    if (requiredElements < 1)
    {
      throw new ArgumentOutOfRangeException(nameof(requiredElements), "Minimum element count of 1 is required.");
    }

    _requiredElements = requiredElements;
  }

  protected override ValidationResult IsValid(object value, ValidationContext validationContext)
  {
    if (!(value is IEnumerable enumerable))
    {
      return new ValidationResult($"The {validationContext.DisplayName} field is required.");
    }

    int elementCount = 0;
    IEnumerator enumerator = enumerable.GetEnumerator();
    while (enumerator.MoveNext())
    {
      if (enumerator.Current != null && ++elementCount >= _requiredElements)
      {
        return ValidationResult.Success;
      }
    }

    return new ValidationResult($"At least {_requiredElements} elements are required for the {validationContext.DisplayName} field.");
  }
}

次のように使用します。

public class Dto
{
  [MinimumElementsRequired(2)]
  public IEnumerable<string> Values { get; set; }
}
于 2020-04-02T13:02:42.830 に答える
1

Dove(@dove)の応答をC#9構文に更新するだけです。

    public class MustHaveOneElementAttribute : ValidationAttribute
    {
        public override bool IsValid(object value)
            => value is IList {Count: > 0};
    }
于 2021-05-27T14:43:29.797 に答える
-1

MinLength属性は、値がnullの場合、その値を有効と見なします。したがって、モデル内のプロパティを空の配列として初期化するだけで機能します。

MinLength(1, ErrorMessageResourceName = nameof(ValidationErrors.AtLeastOneSelected), ErrorMessageResourceType = typeof(ValidationErrors))]
int[] SelectedLanguages { get; set; } = new int[0];
于 2018-04-15T20:08:04.627 に答える