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

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

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

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

ASP.NET

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

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

685閲覧

ASP.NET MVC5(VB.NET)環境でモデルバインディングを利用した複数のパラメータ送信が動作しない

fango

総合スコア20

MVC

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

ASP.NET

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

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2018/04/04 01:20

編集2018/04/04 04:13

表題通り、ASP.NET MVC5(利用言語:VB.NET)の環境下においてパラメータの送信が上手く行かずに困っています。
私自身、最近になってMVC5の基礎を学習し始めたばかりのため基本的な部分の見落とし等ありましたらご容赦下さい。

目的はView上に複数の入力欄を設け、ユーザーが内容を入力して送信ボタンを押すことで
View上にある入力項目の内容全てを1つのModelオブジェクトに格納してControllerに渡したいと考えています。

まず試験的に、以下の3つを作成して実行してみました。
0. 2つのテキスト入力欄を持つView

  1. Viewのテキスト入力欄で入力された2つの値を格納するModel
  2. Viewから入力された値をModelオブジェクトで受け取り、値が格納されているかをチェックし

 値が入っていれば「OK」、Nothingであった場合は「NG」をViewの入力欄に出力するController

▼1.View

HTML

1@ModelType TestProject.FuncModel 2@Code 3 'ページタイトル設定 4 ViewBag.Title = "モデルバインディングによる複数パラメータ送信テスト" 5 '共通レイアウト 6 Layout = "~/Views/Shared/_Layout.vbhtml" 7End Code 8 9@Using Html.BeginForm() 10 11 @Html.EditorFor(Function(model) model.param1) 12 @Html.EditorFor(Function(model) model.param2) 13 14 @<input type="button" value="SUBMIT実行" onclick="document.forms[0].action = '/Func2/Post';document.forms[0].submit()"/> 15 16End Using

▼2.Model

VB.NET

1Public Class FuncModel 2 Public param1 As String 3 Public param2 As String 4End Class

▼3.Controller

VB.NET

1Imports System.Web.Mvc 2 3Namespace Controllers 4 Public Class FuncController 5 Inherits Controller 6 7 ' 初期表示 8 Function Index() As ActionResult 9 Dim viewModel As FuncModel = New FuncModel() 10 11 Return View("FuncView", viewModel) 12 End Function 13 14 Function post() As ViewResult 15 Return View() 16 End Function 17 18 'Viewの「SUBMIT実行」ボタン押下時に実行されるFunction 19 <HttpPost()> 20 Function Post(model As FuncModel) As ActionResult 21 'Viewに渡す値を纏めて格納するModel 22 Dim viewModel As FuncModel = New FuncModel() 23 24 If ModelState.IsValid Then 25 26 If model.param1 Is Nothing Then 27 viewModel.param1 = "param1取得NG" 28 End If 29 30 If model.param2 Is Nothing Then 31 viewModel.param2 = "param2取得NG" 32 End If 33 34 End If 35 36 '遷移先View名と引き渡す値を格納したModelオブジェクトを指定 37 Return View("FuncView", viewModel) 38 End Function 39 End Class 40End Namespace

これらを作成して実行し、View上のテキスト入力欄に適当な文字列を入力して「SUBMIT実行」のボタンを押下したところ
2つの入力欄にはそれぞれ「param1取得NG」「param2取得NG」の文言が表示されました。

View→Controllerは値が渡っていませんが、Controller→Viewは値が渡っているため
モデルバインディングが完全に動作していない訳では無いようです。

そして、下記のようにFunctionの引数に直接param1・param2を追加するとNGにならず
デバッグ実行で確認するとparam1・param2共に画面で入力した値が格納されていることが確認できました。

VB.NET

1 'Viewの「SUBMIT実行」ボタン押下時に実行されるFunction 2 <HttpPost()> 3 Function Post(model As FuncModel, param1 As String, param2 As String) As ActionResult 4 'Viewに渡す値を纏めて格納するModel 5 Dim viewModel As FuncModel = New FuncModel() 6 7 If ModelState.IsValid Then 8 9 If param1 Is Nothing Then 10 viewModel.param1 = "param1取得NG" 11 End If 12 13 If param2 Is Nothing Then 14 viewModel.param2 = "param2取得NG" 15 End If 16 17 End If 18 19 '遷移先View名と引き渡す値を格納したModelオブジェクトを指定 20 Return View("FuncView", viewModel) 21 End Function

この事から、モデルバインディング自体は機能しているもののView→Controllerに値を渡す際に
値格納用のModelに入力値が格納されていない、という現象が起きていることが確認できます。
しかし、何故Modelに値が格納されないのか原因が分からずに停滞している状態です。

ご存知の方がいらっしゃいましたら、どうか原因についてご教示いただけないでしょうか。
よろしくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/04/04 02:30

ASP.NET のタグをつけてください。
fango

2018/04/04 04:14

ご指摘ありがとうございます。タグを追加しました
guest

回答1

0

ベストアンサー

  1. Viewから入力された値をModelオブジェクトで受け取り、値が格納されているかをチェックし値が入っていれば「OK」、Nothingであった場合は「NG」をViewの入力欄に出力するController

ASP.NET MVC アプリでは普通そういうことはしません。質問者さんの独自実装のようですが、どうしてもそうする必要があるのですか?

そうでなければ普通に標準で備わっている機能を利用することをお勧めします。

さらに、MVC3 以降ではクライアントサイドでの jQuery ライブラリによる検証もデフォルトで実装されるようになっています。

詳しくは以下の記事を見てください。「コレクションの」となっていますが、その分少し複雑になっているだけで、今回の質問者さんのケースでも基本は同じです。

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

不明点・疑問点があれば聞いてください。

【追伸】

View→Controllerは値が渡っていませんが、

それはどのように確認しましたか? 以下の記事の上から二つ目の画像のように、デバッガで簡単に調べられるはずですがやってみましたか?

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

投稿2018/04/04 02:58

編集2018/04/04 03:34
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

fango

2018/04/04 04:23

>ASP.NET MVC アプリでは普通そういうことはしません。質問者さんの独自実装のようですが、どうしてもそうする必要があるのですか? これに関しては私の記載が不足しておりました。申し訳ありません。 今回作成しているのはView-Controller間の値の受け渡しについて学習するための機能であり 値格納用Modelに値をセットしてView側のテキスト入力欄に渡すことで どう表示されるかを確認するための意味合いもありました。 将来的には入力チェックをController側でやるつもりは無く、アノテーションを利用したチェックを実装するつもりです。 とはいえそのあたりの知識は不足しておりますので、ご紹介いただきましたサイトも併せて学習させていただきます。 >それはどのように確認しましたか? 以下の記事の上から二つ目の画像のように、デバッガで簡単に調べられるはずですがやってみましたか? 実行ボタン押下で呼び出されるFunction内にブレークポイントを置き、デバッガ上でFunctionの引数model内の値を確認しました。 結果、変数param1とparam2どちらの値もNothingになっており、Modelに値が渡されていないと判断しました。 質問記事の後半に記載している通り、Functionの引数にparam1・param2を直接指定した場合も 同様にデバッガで格納値を確認し、View上で入力した内容が渡ってきていることを確認しています。 現状、この【引数に指定しているModelにView側からPOST送信された値が格納されない】という点が解決できていない状況です。
退会済みユーザー

退会済みユーザー

2018/04/04 04:32

FuncModel クラスの中に定義されているのはプロパティでなくフィールドというところが原因ではないかと思います。フィールドをプロパティに変更して試したらどうなりますか?
退会済みユーザー

退会済みユーザー

2018/04/04 04:49

ASP.NET MVC のことを体系的に学べる本を買って勉強してはいかがでしょう。そうすればそのあたりの基本のキのことろでつまづくことはなくなるのではないかと思うのですが・・・
fango

2018/04/04 04:54 編集

ありがとうございます。試したところ正にその通りでした。 FuncModelクラス内の定義を以下の通り修正することでVIEWからの値を受け取ることが 可能になりました。 Public Property param1 As String Public Property param2 As String 大変基礎的な部分でお恥ずかしい限りです。 お陰様で多数の入力フォームを持つ機能の作成に挑戦できそうです。 ありがとうございました。 また、提示いただいたアノテーションによるチェック機能の実装も並行して学習していきます。 大変お世話になりました。 > ASP.NET MVC のことを体系的に学べる本を買って勉強してはいかがでしょう。 今後のことも考えて購入することにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問