質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

1回答

1449閲覧

ModelStateの一部の要素(リスト要素)について検証エラーをクリアしたい

Taichirou

総合スコア12

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2023/03/01 05:44

編集2023/03/06 18:07

◇環境
OS:Windows10
IDE:VisualStudio2015
framework:.NET Framework 4.6.1

◇実現したい事
以下のModelの様に検証を実装している場合について
下記、検索処理(Kensaku)のコード中の
「リストデータの検証は不要」の箇所においては
Rows要素の入力検証を無効としたいと考えております。

Model

1Public Class Page1 2 <CustomValidation(GetType(Page1), "SearchRequired")> 3 Public Property InDate As Date? 4 5 Public Property Rows As New List(Of Page1.Row) 6 7 Public Property RowData As Row 8 9 Public Class Row 10 <RegularExpression("NG", ErrorMessage:="NGはNG")> 11 Public Property ITEM1 As String 12 13 <RegularExpression("NG", ErrorMessage:="NGはNG")> 14 Public Property ITEM2 As String 15 16 End Class 17 18 Public Shared Function SearchRequired(m As String, context As ValidationContext) As ValidationResult 19 Dim kensaku = CType(context.ObjectInstance, Page1) 20 21 If Not kensaku.InDate Then 22 Return New ValidationResult(String.Format(”{0}は必須です”, "日付")) 23 End If 24 25 Return ValidationResult.Success 26 27 End Function 28 29End Class

Kensaku

1 <HttpPost()> 2 <ValidateAntiForgeryToken> 3 Function Index(model As Page1) As ActionResult 4 5 'リストデータの検証は不要(以下が動作しない) 6 'ModelState("Rows").Errors.Clear() 7 8 ' 入力チェック 9 If Not ModelState().IsValid Then 10 Return View("Index", model) 11 End If 12 13 ModelState.Clear() 14 15 ' 検索処理を呼び出し 16 Search(model) 17 18 Return RedirectToAction("Index", "Page1") 19 20 End Function

◇試したこと
●動作する例
ModelState("InDate").Error.Clear
→この場合、InDateの検証エラーはクリアできておりました。

●NGの例
ModelState("Rows").Error.Clear
ModelState("Rows*").Error.Clear
→エラーとなりました。

◇質問
ブレークポイントを作りModelStateのKey値を見ると
Rows[0].ITEM1
Rows[0].ITEM2
Rows[1].ITEM1
Rows[1].ITEM2


と続いていたので一つずつエラーをクリアする必要があると考えております。
今回の場合、どのように指定すれば
Rows[0].ITEM1 以下の全ての検証エラーをクリアできるのか
お教えいただきたく存じます。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/03/01 06:24

開発環境を質問欄を編集して追記してください。(例: Windows 10 の Visual Studio 2022 で ASP.NET Core MVC アプリをターゲットフレームワーク .NET 7.0 で作っています・・・とか)
退会済みユーザー

退会済みユーザー

2023/03/01 06:44 編集

質問の Model のプロパティには検証属性が付与されていませんが「Rowsの検証エラー」というのはどういう条件で出るのですか? また、「とある処理の際」というのは、どのタイミングで、どこで、どういう条件のときそれに該当すると判定するのでしょう?
Taichirou

2023/03/01 08:07

SurferOnWwwさん 質問いただきありがとうございます。 環境及び、処理タイミングにつきまして 明日には追記させて頂きます。 (現在実環境と離れた場所にいる為、申し訳ございません。) またお時間御座いましたらでかまいませんので、 ご確認いただけますと幸いです。
Taichirou

2023/03/02 00:07

SurferOnWwwさん お世話になっております。 情報追記いたしました。 お時間ございましたら再度ご確認いただけますと幸いです。
退会済みユーザー

退会済みユーザー

2023/03/02 03:27 編集

上の私の質問、 > 「とある処理の際」というのは、どのタイミングで、どこで、どういう条件のときそれに該当すると判定するのでしょう? に対する答えは書いてもらえたでしょうか? > If Not kensaku.InDate Then 上のコードは正しいですか? If kensaku.InDate Is Nothing Then の間違い? 何にせよ kensaku.InDate を検証するだけなら CustomValidationAttibute を使う必要はないと思うのですが、コードに書いてない何か別の検証があるのですか? 
退会済みユーザー

退会済みユーザー

2023/03/02 05:33

なぜ、 「とある処理の際」というのは、どのタイミングで、どこで、どういう条件のときそれに該当すると判定するのでしょう? とか、 > If Not kensaku.InDate Then 上のコードは正しいですか?  ・・・ということを聞いているかと言うと、 > 'リストデータの検証は不要(以下が動作しない) と、質問者さんが試してダメだったといっていることを追求していって、やっぱりダメだったとなったのでは時間と労力の無駄になるからです。別の方法、たとえばカスタムモデルバインダを使うなどを考えるとすると、上で聞いたことの詳細を知る必要があるからです。 答えられない事情とかはないですよね?
Taichirou

2023/03/03 12:43

再度ご質問いただきありがとうございます。 また、質問への回答ができておらず申し訳ございません。 QAに不足がある点は理解いたしましたため、開発環境を触れるタイミングで追記させていただきます。 ただ、いつまでにできるか?はお答えできませんため、ご了承ください。
退会済みユーザー

退会済みユーザー

2023/03/03 13:07

それはもういいので、回答に対するフィードバック(役に立った/立たなかった。役に立たなかったならどこがダメだったのかなどなど)を書いてください。
退会済みユーザー

退会済みユーザー

2023/03/06 09:07

いつまでも放置しておかないで、回答に対するフィードバック(役に立った/立たなかった。役に立たなかったならどこがダメだったのかなどなど)を書いてください。上のコメント欄の質問にはもう答えなくていいので。
guest

回答1

0

「『とある処理の際』というのは、どのタイミングで、どこで、どういう条件のときそれに該当すると判定するのでしょう?」という質問に答えがないし、アクションメソッドの最初の行で無条件にクリアするなら最初から検証しなければいいし、CustomValidationAttibute など必要がないはずだし、RegularExpression の設定が変・・・ということで、いろいろ疑問ですが、とにかく何でもいいから、

"InDate" 以外の項目はアクションメソッドの最初の行で無条件にエラーをクリアすればよい

ということで回答しておきます。

Controller.ModelState プロパティで取得できるのは ModelStateDictionary です。

ModelStateDictionary クラス
https://learn.microsoft.com/ja-jp/dotnet/api/system.web.modelbinding.modelstatedictionary?view=netframework-4.8

それを foreach で反復処理すると KeyValuePair<String, ModelState> オブジェクトを取得できます。その Key が "InDate" か否かを調べて、"InDate" でなければその ModelState のエラーをクリアすれば良いと思います。

コードで書くと以下のような感じです。コードは C# ですが読めなければ変換サービス https://converter.telerik.com/ があるので使ってみてください。

C#

1public ActionResult Edit(Page1 model) 2{ 3 foreach (KeyValuePair<string, ModelState> keyValuePair in ModelState) 4 { 5 if (keyValuePair.Key == "InDate") 6 { 7 continue; 8 } 9 10 keyValuePair.Value.Errors.Clear(); 11 } 12 13 if (ModelState.IsValid) 14 { 15 // 必要な処置 16 return RedirectToAction("Index"); 17 } 18 19 return View(model); 20}

投稿2023/03/03 09:24

編集2023/03/03 12:12
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問