none
[ASP.NET MVC]ModelState.IsValid で Dataannotations RRS feed

  • 質問

  • お世話になります。

    ASP.NET MVCにおける項目の追加について質問があります。

    現在、ASP.NET MVCでWEBアプリ作成の練習をしています。

    環境としては

    Windows8 でVisual Studio2013 Proで ASP.NET MVC 5 、Entity Framework6 を使用しています。

    おこないたい内容としては

    SchoolテーブルとSchoolInformationテーブルがあり

    1つのSchoolに対して複数のSchoolIndormationを作成できるように作成しています。

    Viewで、1つの画面内でSchoolのデータと複数のSchoolInformationを入力します。

    (SchoolInformationは、追加ボタンを押すとテキストボックスが追加され複数個入力できるようにしています)

    コントローラーは以下の内容です

            [HttpPost]
            [ValidateAntiForgeryToken]
            public async Task<ActionResult> Create([Bind(Include = "Id,text")] School school,FormCollection data)
            {

              System.Diagnostics.Debug.WriteLine(Request.Form["test"]);

                if (ModelState.IsValid)
                {
                    db.Schools.Add(school);

                    //複数データを作成する(まだ作成してません)
                    var schoolInfo = new SchoolInfomation();
                    schoolInfo.Information = Request.Form["test"];
                    schoolInfo.School = school;

                    db.SchoolInfomations.Add(schoolInfo);
                    //複数データを作成する(まだ作成してません)

                    await db.SaveChangesAsync();
                    return RedirectToAction("Index");
                }

                return View(school);
            }

    この時、ModelState.IsValidでSchoolInformationのDataannotationsの検証をおこないたいのですが

    どのような方法がありますでしょうか。

    拙い説明で申し訳ありませんが、よろしくお願いします。




    • 編集済み wtnb-ms 2014年8月22日 6:53
    2014年8月22日 6:47

回答

  • SchoolInformation がバインディングを通るように Createメソッドの引数を設定すれば勝手にやってくれるかと。


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)

    • 回答としてマーク wtnb-ms 2014年8月26日 9:22
    2014年8月22日 9:14
  • データアノテーション検証コントロールで検証するのは基本ユーザー入力ですが、質問者さんのやりたいこともユーザー入力の検証ということでいいのですよね? SchoolInformation 方はどうも違うような感じがするのですが・・・

    再度質問される際はそのあたりを明確にしていただけますか。

    • 回答としてマーク wtnb-ms 2014年8月26日 9:22
    2014年8月26日 7:46

すべての返信

  • SchoolInformation がバインディングを通るように Createメソッドの引数を設定すれば勝手にやってくれるかと。


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)

    • 回答としてマーク wtnb-ms 2014年8月26日 9:22
    2014年8月22日 9:14
  • School とか SchoolInformation とか何だかよく分かりませんが・・・

    > この時、ModelState.IsValidでSchoolInformationのDataannotationsの検証を
    > おこないたいのですがどのような方法がありますでしょうか。

    要するに上記が質問で、質問者さんのケースでは ModelState.IsValid で検証できないと言っていますか?

    以下のチュートリアルのようにすれば検証できるはずですが?

    #21. データ アノテーション検証コントロールでの検証
    http://technet.microsoft.com/ja-jp/subscriptions/ff642519.aspx

    このチュートリアルの内容が分からない、または質問者さんのやりたいこととは違う場合は、再度質問してください。

    その際は、できれば School とか SchoolInformation とか質問者さんにしか分からないことはなるべく質問文に含めないでいただくようお願いします。

    2014年8月22日 10:02
  • 小野様

    回答ありがとうございます。

    public async Task<ActionResult> Create([Bind(Include = "Id,text")] School school,FormCollection data)

    この引数にSchoolInformation schoolInformationを追加するという意味でしょうか

    public async Task<ActionResult> Create([Bind(Include = "Id,text")] School school, SchoolInformation schoolInformation, FormCollection data)

    でも試してみましたがダメでした。

    質問のように、FormCollectionで取得し、

    db.SchoolInfomations.Add(scInfo);とした場合でもCreateの引数次第で検証されるということだとは思うのですが

    知識がなくどのような記述をすればよいかわかりません。

    ご教示いただけませんでしょうか。


    • 編集済み wtnb-ms 2014年8月26日 7:14
    2014年8月26日 6:30
  • SurferOnWww様

    回答ありがとうございます。

    >School とか SchoolInformation とか何だかよく分かりませんが・・・

    申し訳ありません、例を出したほうがわかりやすいと思っていました。

    これからはParent とChild など一般的な内容で質問したいと思います。

    >要するに上記が質問で、質問者さんのケースでは ModelState.IsValid で検証できないと言っていますか?

    ModelState.IsValidで検証はできていますが、私の質問でいうSchoolのみの検証しかきいていない状態です。

    SchoolInformationの検証されていなく、2つのモデルに対して検証をおこないたいのが質問になります。

    >このチュートリアルの内容が分からない、または質問者さんのやりたいこととは違う場合は、再度質問してください。

    承知しました。文章を練って質問したいと思います。



    • 編集済み wtnb-ms 2014年8月26日 7:15
    2014年8月26日 6:40
  • データアノテーション検証コントロールで検証するのは基本ユーザー入力ですが、質問者さんのやりたいこともユーザー入力の検証ということでいいのですよね? SchoolInformation 方はどうも違うような感じがするのですが・・・

    再度質問される際はそのあたりを明確にしていただけますか。

    • 回答としてマーク wtnb-ms 2014年8月26日 9:22
    2014年8月26日 7:46
  • SurferOnWww様

    回答ありがとうございます。

    public async Task<ActionResult> Create([Bind(Include = "Id,text")] School school, [Bind(Include = "Id,information")] SchoolInformation schoolInformation, FormCollection data)

    で、検証はされるようになりました。

    ですが、動作をみると

    >データアノテーション検証コントロールで検証するのは基本ユーザー入力ですが、質問者さんのやりたいこともユーザー入力の検証ということでいいのですよね? SchoolInformation 方はどうも違うような感じがするのですが・・・

    の部分ご指摘の通りを勘違いしていたようです。

    新たな質問を作成しております、またご教示いただければと思います。

    よろしくお願いします。

    2014年8月26日 9:22