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

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

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

RazorはASP.NET Web PagesとASP.NET MVCで使われているビュー・エンジンです。HTMLマークアップとC#またはVisual Basicのコードに対応しています。マークアップとコードの間の切り替えは"@"で記されています。

ASP.NET

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

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

Q&A

解決済

1回答

15594閲覧

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

mongamo

総合スコア1

Razor

RazorはASP.NET Web PagesとASP.NET MVCで使われているビュー・エンジンです。HTMLマークアップとC#またはVisual Basicのコードに対応しています。マークアップとコードの間の切り替えは"@"で記されています。

ASP.NET

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

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

0グッド

0クリップ

投稿2020/05/10 05:17

編集2020/05/10 07:13

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

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/05/10 05:54

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

2020/05/10 07:17

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

回答1

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/10 07:37

編集2020/05/10 08:10
退会済みユーザー

退会済みユーザー

総合スコア0

mongamo👍を押しています

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

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

mongamo

2020/05/10 09:16

SurferOnWww様 対象は単一の SearchCondModel オブジェクトの方となります。こちらこそ問題の明示ができておらず申し訳ございません。結論からいうと先程解決致しました。SurferOnWww様の回答に「親子関係の~」という記述をヒントに、Modelより「  // 検索条件リスト public SearchCondModel SearchCondList { get; set; } = new SearchCondModel();」の箇所をコメントアウトすることで「//検索条件モデル  public class SearchCondModel」をViewからControllerへPOSTすることができました。(もともと自分のModelの実装を疑っていましたのでw) ですがSurferOnWww様の迅速な回答により解決できました。ご対応ありがとうございました! 回答いただいたデータバインドと親子関係のあるModelの実装についても使う機会がくると思いますので拝見致します。また、SurferOnWww様のブログ記事にある他の記事も拝見させていただきます。この度はありがとうございました。
退会済みユーザー

退会済みユーザー

2020/05/10 09:48

> 対象は単一の SearchCondModel オブジェクトの方となります。 そうであれば、単純に SearchCondModel クラスを Controller と View の間のデータ受け渡しの Model に設定して、スキャフォールディング機能を使って View を自動生成すれば何も悩むことなく目的は果たせるはずですが? 何故質問に書いてあるようなことをしているのか訳が分かりません。
mongamo

2020/05/11 06: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 07:27 編集

情報不足で質問者さんが何をしているのか分かりませんが、とにかく「選択したコードジェネレータを実行中にエラーが発生しました」というのは表題の「ASP.NET MVC POST時に引数でModelの値をアクションメソッドに渡せない」とは別の問題であることは間違いなく、たぶん Entity Framework がらみのトラブル(EF Code First での DB 生成?・・・Model だけ定義して、スキャフォールディング機能でコンテキストクラスも Controller も View も DB も一切合切自動生成しようとしているとか?)でしょう。 きちんと問題の切り分けを行って、ピンポイントで原因を見つけて解決しないと、また同様なトラブルで悩むことになるような気がします。 まずは、DB や Entity Framework には手を出さないで、表題のことのみ、即ちブラウザから POST したデータを Controller のアクションメソッド Index(SearchCondModel _model) の引数に渡すことのみやってみたらどうですか? 絶対そのようなエラーは起きないはずです。
mongamo

2020/05/11 14:54

>DB や Entity Framework には手を出さないで、表題のことのみ、即ちブラウザから POST したデータを Controller のアクションメソッド Index(SearchCondModel _model) の引数に渡すことのみやってみたらどうですか?  一旦POST処理の実装は完了しました。先程のスキャフォールディングができない件はおっしゃるとおり別件なおですが、すぐ調査を継続できないため、必要な際は別件として挙げさせていただきます。きりの悪い終わり方で恐縮ですが、お力を貸して頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.54%

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

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

質問する

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

Razor

RazorはASP.NET Web PagesとASP.NET MVCで使われているビュー・エンジンです。HTMLマークアップとC#またはVisual Basicのコードに対応しています。マークアップとコードの間の切り替えは"@"で記されています。

ASP.NET

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

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。