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

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

ただいまの
回答率

90.51%

  • ASP.NET

    625questions

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

  • MVC

    257questions

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

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 954

Diam0717

score 2

 前提・実現したいこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2018/03/21 18:08

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

    キャンセル

  • SurferOnWww

    2018/03/22 11:07 編集

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

    キャンセル

回答 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;
    }
}

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • ASP.NET

    625questions

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

  • MVC

    257questions

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