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

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

ただいまの
回答率

87.59%

ASP.NET MVC POST時に引数でModelの値をアクションメソッドに渡せない。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,618

score 1

ASP.NET MVCの学習で検索機能を作成しています。検索条件モデルSearchCondListをビューからコントローラーへPOSTし条件にあったデータをDBから抽出したいのですが、タイトルの現象を修正できずこちらを利用させて頂きました。
コントローラーの[HttpPost]側の処理を通っていることはブレークポイントで確認できており、また_modelのRegNoの値がNULLとなっていることを確認できたので、ビューからコントローラーへパラメータを受け渡すモデルの記述が正しくないのかと考えています。よろしくお願い致します。

該当のソースコード

Model  

public class SearchListModels
    {
        /// <summary> コンストラクタ </summary>
        public SearchListModels() { }

        // 参加者リスト
        public List<SearchViewModel> SearchList { get; set; } = new List<SearchViewModel>();

  // 検索条件リスト
        public SearchCondModel SearchCondList { get; set; } = new SearchCondModel();

    }

    //参加者モデル
    public class SearchViewModel     {
        /// ID </summary>
        public string Id { get; set; }

        /// <summary> 参加者番号 </summary>
        public string RegNo { get; set; }
  ・
  (以下検索条件モデルと同じ)
  ・
  ・
  }


     //検索条件モデル
     public class SearchCondModel
     {
        /// <summary> ID </summary>
        public string Id { get; set; }

        /// <summary> 参加者番号 </summary>
        public string RegNo { get; set; }
  ・
  (以下参加者モデルと同じ)
  ・
  ・
  }

Controller

    public class SearchController : Controller
    {
        // 初期化
        ISearchService _service;

        // コンストラクタ-
        public SearchController()
        {
            _service = new SearchService();
        }

  //画面起動時
        public ActionResult Index()
        {
            SearchCondModel _model = new SearchCondModel();
            _model.Id = ViewBag.Id;

            // SearchServiceのDBContextにアクセスしデータ抽出
            return View(_service.GetList(_model));
        }

  //ポスト時処理
        [HttpPost]
        [ValidateAntiFoeryToken]
        public ActionResult Index(SearchCondModel _model)
  (ここで_modelのRegNoはNULLとなっており、ビューから検索条件をうけとれていない。)
        {
            _model.Id = ViewBag.Id;

            // SearchServiceのDBContextにアクセスしデータ抽出
            return View(_service.GetList(_model));
  (ここで検索条件なしの場合のデータを取得している。)
  
        }
    }

View

Index.cshtml

           @*検索条件入力テキストボックス*@
            @using (Html.BeginForm("Index", "Search", FormMethod.Post))
            {
                @Html.AntiForgeryToken()
                @Html.TextBoxFor(x => x.SearchCondList.RegNo)
    (ここでコントローラー側にRegNoを渡せていない。)
            }
    ・
    ・
    ・
    @*検索結果一覧*@
            <table>
                @foreach (var item in Model.SearchList) 
                {
                    <tr><td>
                            @Html.DisplayFor(modelItem => item.RegNo)
       (ここで条件なしの検索結果は取得できている。)
                    </td></tr>
       ・
       ・
       ・
             }
            </table>

試したこと

@Html.TextBoxFor(x => x.SearchCondList.RegNo)を@Html.TextBoxFor(Model => Model.SearchCondList.RegNo)とした場合は、検索結果一覧の@foreach (var item in Model.SearchList)と競合したので、xとしています。

開発環境(追記しました。)

windows 10 pro
VisualStudio 2015 Update3
ASP .NET MVC 5
.NET FrameWork 4.6.1
EntityFramework 6.0
C# 6.0
DB:SQLServer 2017

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • SurferOnWww

    2020/05/10 14:54

    とにかくまず開発環境を書いてください。Visual Studio のバージョン、.NET なのか Core なのかとそのバージョン。DB を使っているならそれが何かとそのバージョン・エディションなどを質問欄を編集して追記してください。

    キャンセル

  • mongamo

    2020/05/10 16:17

    基本情報の不足失礼しました。開発環境を追記しています。さらに不足ありましたらお手数ですがご指摘ください。宜しくお願いいたします。

    キャンセル

回答 1

checkベストアンサー

+1

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

以下の記事を見てください。

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

具体的には、name="prefix[index].Property" というパターンにします。prefix の部分にはアクションメソッドのパラメータ(仮引数)名が入ります。index は 0 から始まる連番です。数字の連続が途切れた場合は解析が停止し、0 から途切れる前までのデータが返されます。

上の記事は Model が少々複雑ですがそれが分かりにくかったら、単純に親子関係のデータを登録する以下の記事の方が分かりやすいかもしれません。

親子関係のあるデータ登録
http://surferonwww.info/BlogEngine/post/2014/12/21/create-relational-data-in-parent-and-child-tables-of-sql-server-database.aspx

上の記事の Model の Parent クラスを質問者さんの Model の SearchListModels クラスに、Child クラスを SearchCondModel クラスに置き換えて考えてみてください。上の記事の Model の定義は記事の一行目にあるリンク「MVC4 EF Code First」をたどって別の記事を見てください。

分からないことがあればこの回答のコメント欄で質問してください。

【追記】

思い違いしていたかも。今回の話は SearchListModels クラスの SearchCondList プロパティから取得できる単一の SearchCondModel オブジェクトで、コレクション云々は関係なかったですか?

つまり、自分は List<SearchCondModel> SearchCondList ... と勘違いしてましたが、質問のコードの SearchCondModel SearchCondList ... の通りで、対象は単一の SearchCondModel オブジェクトで良いのですよね?

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/05/11 15:38

    スキャフォールディング機能を使って View を生成した場合に、以下のようなキー定義の不足エラーが発生しています。こちらを質問に上げるべきだったかもしれません。
    SearchCondModelのキー定義の不足の様ですがModelに[Key]を追加するなどでは変化なしで今の所スキャフォールディングが使えていません。


    以下メッセージとなります。
    選択したコードジェネレータを実行中にエラーが発生しました:
    'Unable to retrieve metadata fo 'Site.Models.searchControlModel'.One or more validation errors were detected during modelgeneration:
    SerchCondModel::EntityType 'SearchCondModel' has no key defained Define the key this EntityType.
    SerchCondModels:EntityType:EntitySet 'SearchCondModel' is based on type 'SearchCondModel' thet has no keys defined.

    キャンセル

  • 2020/05/11 16:04 編集

    情報不足で質問者さんが何をしているのか分かりませんが、とにかく「選択したコードジェネレータを実行中にエラーが発生しました」というのは表題の「ASP.NET MVC POST時に引数でModelの値をアクションメソッドに渡せない」とは別の問題であることは間違いなく、たぶん Entity Framework がらみのトラブル(EF Code First での DB 生成?・・・Model だけ定義して、スキャフォールディング機能でコンテキストクラスも Controller も View も DB も一切合切自動生成しようとしているとか?)でしょう。

    きちんと問題の切り分けを行って、ピンポイントで原因を見つけて解決しないと、また同様なトラブルで悩むことになるような気がします。

    まずは、DB や Entity Framework には手を出さないで、表題のことのみ、即ちブラウザから POST したデータを Controller のアクションメソッド Index(SearchCondModel _model) の引数に渡すことのみやってみたらどうですか? 絶対そのようなエラーは起きないはずです。

    キャンセル

  • 2020/05/11 23:54

    >DB や Entity Framework には手を出さないで、表題のことのみ、即ちブラウザから POST したデータを Controller のアクションメソッド Index(SearchCondModel _model) の引数に渡すことのみやってみたらどうですか? 

    一旦POST処理の実装は完了しました。先程のスキャフォールディングができない件はおっしゃるとおり別件なおですが、すぐ調査を継続できないため、必要な際は別件として挙げさせていただきます。きりの悪い終わり方で恐縮ですが、お力を貸して頂きありがとうございました。

    キャンセル

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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