[解決済み] ASP.NET MVC 条件付き検証
質問
データアノテーションを使用してモデルの条件検証を行うには?
例えば、以下のようなモデル(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)を呼び出すだけです。
この回答を複雑にしたくなかったので、最終的な実装の詳細については触れませんでした(最終的にはプロダクションコードで重要になります)。
関連
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】Nullableオブジェクトは値を持たなければならない?
-
[解決済み] ファイルアップロード ASP.NET MVC 3.0
-
[解決済み] ASP.NET MVC Frameworkで複数のサブミットボタンを処理する方法は?
-
[解決済み] ASP.NET MVCでenumからドロップダウンリストを作成するにはどうすればよいですか?
-
[解決済み] ASP.NET MVC - カスタムIIdentityまたはIPrincipalの設定
-
[解決済み] ASP.NET MVCでビューをコンパイルする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み] [Solved] アセンブリ System.Web.Extensions dll はどこにありますか?
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み] 関数を終了するには?