1. ホーム
  2. c#

[解決済み] ASP.NET MVC 条件付き検証

2022-02-07 21:09:46

質問

データアノテーションを使用してモデルの条件検証を行うには?

例えば、以下のようなモデル(PersonとSenior)があるとします。

public class Person
{
    [Required(ErrorMessage = "*")]
    public string Name
    {
        get;
        set;
    }

    public bool IsSenior
    {
        get;
        set;
    }

    public Senior Senior
    {
        get;
        set;
    }
}

public class Senior
{
    [Required(ErrorMessage = "*")]//this should be conditional validation, based on the "IsSenior" value
    public string Description
    {
        get;
        set;
    }
}

そして、次のようなビュー。

<%= Html.EditorFor(m => m.Name)%>
<%= Html.ValidationMessageFor(m => m.Name)%>

<%= Html.CheckBoxFor(m => m.IsSenior)%>
<%= Html.ValidationMessageFor(m => m.IsSenior)%>

<%= Html.CheckBoxFor(m => m.Senior.Description)%>
<%= Html.ValidationMessageFor(m => m.Senior.Description)%>

Senior.Descriptionプロパティを条件付き必須項目とし、IsSeniorプロパティを選択した場合(true - >必須)、必須項目となるようにしたいのですが。ASP.NET MVC 2でデータアノテーションを使用して条件付き検証を実装するにはどうすればよいでしょうか。

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

を処理することで解決しました。 ModelState" ディクショナリーが含まれています。ModelState辞書には、検証する必要のあるすべてのメンバーが含まれています。

以下はその解決策です。

を実装する必要がある場合は 条件付き検証 は、あるフィールドに基づくものです (例: A=true ならば、B は必須です)。 プロパティレベルのエラーメッセージを維持しながら (これはオブジェクトレベルのカスタムバリデータには当てはまりません)これを実現するには、"ModelState" を処理し、そこから不要なバリデーションを取り除くだけでよいのです。

...あるクラスで...

public bool PropertyThatRequiredAnotherFieldToBeFilled
{
  get;
  set;
}

[Required(ErrorMessage = "*")] 
public string DepentedProperty
{
  get;
  set;
}

...クラスの続き...

...何らかのコントローラアクションで...

if (!PropertyThatRequiredAnotherFieldToBeFilled)
{
   this.ModelState.Remove("DepentedProperty");
}

...

これで条件付き検証を実現し、それ以外の部分はそのままにしています。


UPDATEです。

これが私の最終的な実装です。モデルのインターフェースと、そのインターフェースを実装しているモデルを検証するアクション属性を使用しました。インターフェースは、Validate(ModelStateDictionary modelState) メソッドを規定します。アクションの属性は、IValidatorSomethingのValidate(modelState)を呼び出すだけです。

この回答を複雑にしたくなかったので、最終的な実装の詳細については触れませんでした(最終的にはプロダクションコードで重要になります)。