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

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

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

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

ASP.NET

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

Q&A

1回答

4891閲覧

MVC 独自検証でList型のObjectのプロパティに付与しても何も変わらない

Diam0717

総合スコア6

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

ASP.NET

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

0グッド

0クリップ

投稿2018/03/21 08:36

編集2022/01/12 10:55

前提・実現したいこと

MVC5 独自検証(CustomValidation)をList型のObjectにあるプロパティに付与しても
エラーメッセージが表示されないです。

発生している問題・エラーメッセージ

MVC5で今回独自検証(CustomValidation)を実装しました。
対象のchtmlにバインドするモデル(クラス)にList型のオブジェクトのプロパティに
実装した独自検証を付与しました。

例)------------------------------------
public class sample
{
public List<Data> Items {get;set;}
}

public class Data
{

[独自検証バリデーション]
public int Id {get;set;]

}


chtml内ではPartialviewでList<Data> Itemを回して作成しています。

例)------------------
(chtmlのソース)(Main.chtml)

@Foreach(var item in Model.Items)
{
@html.partial("AddPartial",item)
}


(Addpartialのソース)(chtml)

(抜粋)
@html.TextAreafor(m => m.Id)
@html.ValidationMessageFor(m > m.id, new {class = "text-danger"})


Main.chtmlには送信ボタンがあり、postでコントローラーのアクションメソッドに飛ぶように
なっております。
(例)

[HttpPost]
[route("TempsaveData")]
public Actionresult TempsaveData(sample model)
{

// 独自検証が効いていることは確認しました。
// このif文内を通ります。
if (!ModelState.Isvalid)
{

return View(model);

}

※独自検証が効いて、return View(model)を通って、Viewに戻るのですが、
独自検証で実装したメッセージと、コントローラーの枠が赤色にはならず、
なにも変わらないように見えております。

検証が通っているのにView側でメッセージと枠が赤色にならない原因は
何なのでしょうか?

※(独自検証の実装の中身はRequiredの検証の実装とまったく同じにしたのですが
変わりませんでした。)

※(List型のオブジェクトにあるプロパティに[Required]に返るとうまく動作しました。
{コントローラに赤枠が出て、メッセージが表示されます})

独自検証を実装する際に気を付ける事はありますでしょうか?

知恵をおかしいただけますでしょうか?

※開発環境
OS:Windows 10
.NET : ver 4.7
Visual studio 2017 Ver 15.5.2

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/03/21 09:08

ASP.NET MVC の話ですか? であれば ASP.NET のタグをつけていただくようお願いします。あと、あなたの開発環境(OS, .NET, IIS, Visual Studio のバージョンなど)を書いてください。
退会済みユーザー

退会済みユーザー

2018/03/22 09:25 編集

たびたびのお願いですみませんが、問題を再現できる必要最低限のところまで今のコードをどんどん削っていくなどして、問題の原因となっている部分を絞り込んでいただけませんか? 今のコードですと、ここに書いてあること以外は知り得ない第三者には問題の再現が困難です。問題が再現できないと的確な答えも出しにくいです。コードを削っていく過程で原因が分かって自己解決できるかもしれませんし、できなくてもそのコードをアップすれば回答者の方でも問題を再現でき、的確な答えが得やすいと思います。
guest

回答1

0

問題を再現できないしコードの動きも追えませんのでハズレかもしれませんが、気になった点を書いておきます。

コレクションのモデルバインディングがうまく行われるようにするには、レンダリングされる html 要素の name 属性が連番のインデックスを含むようにする必要があるはずです。

具体的には、name="prefix[index].Property" というパターンにします。prefix の部分にはアクションメソッドのパラメータ(仮引数)名が入ります。index は 0 から始まる連番です。詳しくは以下の記事を見てください。

コレクションのデータアノテーション検証
http://surferonwww.info/BlogEngine/post/2014/09/01/validation-of-collection-data-during-model-binding-using-data-annotation.aspx

質問にある (Addpartialのソース)(chtml) を見るとそうなってないようです。それが原因かどうかは分かりませんが、検討してみてはいかがでしょう。

あとは、上のコメントでお願いしましたように、質問者さんの方で、問題を再現できる必要最低限のところまで今のコードをどんどん削っていくなどして、問題の原因となっている部分を絞り込んでいただけませんか?

今の情報では、CustomValidator 自体に問題があるのか、それ以外なのかもわかりません。

【2018/3/23 追伸】

念のため、上に紹介した記事「コレクションのデータアノテーション検証」のコードの Country クラスで、Name プロパティに CustomValidation を付与して検証してみましたが、期待通りエラーメッセージは表示されます。

なので、質問者さんのやり方にどこか問題があるように思われます。

検証に使った Country クラスのコードは以下の通りです。Country クラス以外は記事のコードの通りで、一切変更していません。

public class Country { public Country() { Details = new CountryInfo(); } // 2018/3/23 CustomValidation は teratail の検証用 // https://teratail.com/questions/118421 [CustomValidation(typeof(Country), "ValidateCountryName")] //[Required(ErrorMessage = "{0} は必須")] [StringLength(15, ErrorMessage = "{0} は {1} 文字以内")] [Display(Name = "国名")] public String Name { get; set; } public CountryInfo Details { get; set; } public static ValidationResult ValidateCountryName(string name) { if (string.IsNullOrEmpty(name)) { return new ValidationResult("null または Empty"); } return ValidationResult.Success; } }

どこが違うのかチェックしてみてください。

投稿2018/03/22 07:54

編集2018/03/23 05:53
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問