1. ホーム
  2. c#

[解決済み] リストに対するViewModelの検証

2023-06-20 21:11:32

質問

以下のようなビューモデルの定義があります。

public class AccessRequestViewModel
{
    public Request Request { get; private set; }
    public SelectList Buildings { get; private set; }
    public List<Person> Persons { get; private set; }
}

私のアプリケーションでは、アクセス要求に対して少なくとも1人の人がいなければならないのですね。 どのような方法で検証を行うのでしょうか?私は、この検証をコントローラで行いたいとは思っていません。唯一の選択肢はカスタムバリデーション属性でしょうか?

編集してください。 現在、この検証はFluentValidation(素敵なライブラリです!)を使って行っています。

RuleFor(vm => vm.Persons)
                .Must((vm, person) => person.Count > 0)
                .WithMessage("At least one person is required");

どのように解決するのですか?

Data Annotationsを使用して検証を行う場合、カスタム属性が必要な場合があります。

public class EnsureOneElementAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        var list = value as IList;
        if (list != null)
        {
            return list.Count > 0;
        }
        return false;
    }
}

として、その後に

[EnsureOneElement(ErrorMessage = "At least a person is required")]
public List<Person> Persons { get; private set; }

とか、より汎用的にするために

public class EnsureMinimumElementsAttribute : ValidationAttribute
{
    private readonly int _minElements;
    public EnsureMinimumElementsAttribute(int minElements)
    {
        _minElements = minElements;
    }

    public override bool IsValid(object value)
    {
        var list = value as IList;
        if (list != null)
        {
            return list.Count >= _minElements;
        }
        return false;
    }
}

として、その後に

[EnsureMinimumElements(1, ErrorMessage = "At least a person is required")]
public List<Person> Persons { get; private set; }

個人的には FluentValidation.NET を使います。なぜなら、宣言的ではなく命令的な検証ロジックが好きだからです。その方がより強力だと思うからです。というわけで、私のバリデーションルールは単純に以下のようになります。

RuleFor(x => x.Persons)
    .Must(x => x.Count > 0)
    .WithMessage("At least a person is required");