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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVC

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

Razor

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

ASP.NET

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

Q&A

解決済

1回答

6872閲覧

ASP.NET MVC において ViewからController等への値渡し

pomu.pomupomu

総合スコア18

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVC

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

Razor

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

ASP.NET

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

0グッド

0クリップ

投稿2018/06/14 11:46

編集2018/06/15 01:00

前提・実現したいこと

C#でASP.NET MVC5を用いた掲示板機能を作成しようとしており、新規トピック作成機能の実装で、viewでユーザーが選択した値をDBに登録する機能を実装しようとしています。
ViewにRazorを用いて記した@HtmlxxxFor群の値をController側のActionResultに送るにはどうしたらよいでしょうか。

以下の例ですと、Razorで記した@Html.TextBoxForの.textプロパティの値をTopicテーブルのTitleに保存したいです。

初歩的な質問ではないだろうかということは承知なのですが自力で解決できないため、アドバイスを戴けないだろうかと思い投稿しました。宜しくお願いします。

追記
質問欄にていただいたことをもとに詳細を記しました。ご指摘ありがとうございます。
また、TextBoxForを用いていますが、プログラミング初心者の為有用なものの区別がついてないだけでこだわりはないです。
そのためEditFor等他の有用な方法でもご教授頂けるだけでたいへん有り難いです。

発生している問題・エラーメッセージ

The parameterized query '(@title nvarchar(4000)(' expects the parameter '@title', which was not supplied.

該当のソースコード

@Html.TextBoxFor( model => Model.Title, new { @name = "Title", @placeholder = "タイトルを入力してください" } ) @Html.ActionLink( "新規トピックを投稿する", // リンク・テキスト "NewTopicSubmit", // アクション名 "Forum" // コントローラー名 )

C#

1using System; 2using System.Configuration; 3using System.Data.SqlClient; 4using System.Web.Mvc; 5 6namespace Forum.Controllers 7{ 8 public class ForumController : Controller 9 { 10 // 上述したRazorのコードはNewTopic上にある 11 public ActionResult NewTopic() 12 { 13 return View(); 14 } 15 16 17 // 上述したHtml.ActionLinkの"新規トピックを投稿する"をクリックすると実行する 18 public ActionResult NewTopicSubmit() 19 { 20 21 string htmltitle = Request["Title"]; 22 23 // 接続文字列の取得。 24 var connectionString = ConfigurationManager.ConnectionStrings["ForumConnection"].ConnectionString; 25 26 27 using (var connection = new SqlConnection(connectionString)) 28 { 29 30 try 31 { 32 33 // データベースの接続開始 34 connection.Open(); 35 36 using (var transaction = connection.BeginTransaction()) 37 using (var command = new SqlCommand() { Connection = connection, Transaction = transaction }) 38 { 39 40 try 41 { 42 43 // 親テーブルを挿入するSQLの準備 44 command.CommandText = @"INSERT INTO Topic (Title) VALUES (@title)"; 45 command.Parameters.Add(new SqlParameter("@title", htmltitle)); 46 47 // 親テーブルを挿入するSQLの実行 48 command.ExecuteNonQuery(); 49 50 // コミット 51 transaction.Commit(); 52 53 54 } 55 catch 56 { 57 // ロールバック 58 transaction.Rollback(); 59 throw; 60 61 } 62 } 63 } 64 catch (Exception exception) 65 { 66 Console.WriteLine(exception.Message); 67 throw; 68 } 69 finally 70 { 71 // データベースの接続終了 72 connection.Close(); 73 } 74 } 75 return View(); 76 } 77 } 78}

C#

1using System.Collections.Generic; 2using System.Data.Entity; 3 4namespace Forum.Models 5{ 6 public class ForumModels 7 { 8 9 } 10 public class NewTopic 11 { 12 public string Nickname { get; set; } 13 public string Category { get; set; } 14 public string Region { get; set; } 15 public string Title { get; set; } 16 public string Comment { get; set; } 17 } 18 19 public class TopicTitle 20 { 21 public int Id { get; set; } 22 public string Title { get; set; } 23 } 24 25 public class ForumConnection : DbContext 26 { 27 public DbSet<TopicTitle> TopicTitles { get; set; } 28 } 29 30 public class MvcBasicInitializer : CreateDatabaseIfNotExists<ForumConnection> 31 { 32 protected override void Seed(ForumConnection context) 33 { 34 base.Seed(context); 35 36 var topics = new List<TopicTitle> 37 { 38 new TopicTitle 39 { 40 Id = 4, 41 Title ="たいとるー1" 42 } 43 }; 44 topics.ForEach(m => context.TopicTitles.Add(m)); 45 context.SaveChanges(); 46 } 47 } 48} 49

試したこと

webformでは用いることのできたname属性を一致させることでRequest[]に値を授受すること等は試したのですが.cshtmlファイルから.csファイルに値の受け渡しをすることはできませんでした。

補足情報(FW/ツールのバージョンなど)

VS2017
Windows7
.Net Framework 4.6.1
MVC5
テンプレートは用いてないです。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/06/14 13:16

開発環境(OS, .NET, MVC のバージョン、テンプレートは何を使ったかなど)を書いてください。使うのは TextBoxFor で良いのですか?(EditorFor ではなくて) Controller のアクションメソッドのコード全体をアップしてください。
pomu.pomupomu

2018/06/15 00:49

投稿マナーを教えていただきありがとうございます。お手数をかけて申し訳ありまっせんがお手隙の際に追記や補足等も読んでいただけたら幸いです。よろしくお願いします。
guest

回答1

0

ベストアンサー

Model を定義し、それから Entity Framework Code First の機能を利用して LocalDB に DB を作ったようですね。

Controller と View は質問者さんが自力でコードを書いて実装したのでしょうか? 両方とも ASP.NET MVC5 の普通の書き方ではない(はっきり言って、問題あり)なのでそう思いました。

Model と DB が上手くできていれば、Visual Studio のスキャフォールディング機能を利用して自力でコードを書かなくても基本的な Controller と View のコードは自動生成されて、今回のような問題に悩む必要はないはずです。

・・・が、とりあえず、それは置いといて、質問に書かれている View とアクションメソッドのコードをベースに表題の「ViewからController等への値渡し」についてレスします。

// 上述したHtml.ActionLinkの"新規トピックを投稿する"をクリックすると実行する

上の操作は、アクションメソッド NewTopicSubmit を HTTP 動詞 GET で呼び出しているだけですよね。

だとすると、View の @Html.TextBoxFor( ... の値(正確には、それが html に変換されてブラウザに送られた <input type="text" name="Title" ... /> にユーザーが入力した値)は送信されてないはずです。

念のため、Visual Studio でデバッガを使って、NewTopicSubmit メソッドの、

string htmltitle = Request["Title"];

で、値が取得できているかどうかチェックしてください。

もし、値が取得できているとすると、どうやってやったかは分かりませんが、表題の「ViewからController等への値渡し」はできているということになります。あとは ADO.NET のコードの書き方の問題ですので、それを質問者さんの方で調べてください。

値が取得できていないとすると、View を書き換えて、@Html.TextBoxFor( ... の値をアクションメソッド NewTopicSubmit に送信できるようにするという対処が必要だと思います。

具体例は以下のコードを見てください。これは @IT の記事(URL 下記)の Model をベースに Visual Studio Community 2015 で MVC5 プロジェクトを作り、EF6 Code First で LocalDB にデーターベースを作り、それを元にスキャフォールディング機能を利用して Controller と View のコードを自動生成させたものです。(注:アップしたのは今回の質問と関係する Create 部分のみです)

第2回 Entity Frameworkコード・ファーストでモデル開発
http://www.atmarkit.co.jp/fdotnet/aspnetmvc3/aspnetmvc3_03/aspnetmvc3_03_01.html

View

@model Mcv5App2.Models.Book @{ ViewBag.Title = "Create"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h2>Create</h2> @using (Html.BeginForm()) { @Html.AntiForgeryToken() <div class="form-horizontal"> <h4>Book</h4> <hr /> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(model => model.Isbn, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Isbn, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Isbn, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.Price, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Price, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Price, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.Publish, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Publish, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Publish, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.Published, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Published, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Published, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="Create" class="btn btn-default" /> </div> </div> </div> } <div> @Html.ActionLink("Back to List", "Index") </div> @section Scripts { @Scripts.Render("~/bundles/jqueryval") }

Controller / Action Method

using System; using System.Collections.Generic; using System.Data; using System.Data.Entity; using System.Linq; using System.Net; using System.Web; using System.Web.Mvc; using Mcv5App2.Models; namespace Mcv5App2.Controllers { public class BooksController : Controller { private MyMvcContext db = new MyMvcContext(); // ・・・中略・・・ // GET: Books/Create public ActionResult Create() { return View(); } // POST: Books/Create [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create([Bind(Include = "Isbn,Title,Price,Publish,Published")] Book book) { if (ModelState.IsValid) { db.Books.Add(book); db.SaveChanges(); return RedirectToAction("Index"); } return View(book); } // ・・・中略・・・ }

疑問があればコメント欄で質問してください。

投稿2018/06/15 02:22

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/06/17 00:05 編集

問題の原因はクリアになったでしょうか? 参考にアップしたコードは、最低限必要なものばかりとは言え、質問の課題に対するピンポイントな対応策は見つけにくかったかもしれません。もし、ピンポイントな対処方法が不明でしたら 質問してください。
pomu.pomupomu

2018/06/17 05:50

返信が遅くなり申し訳ありません、問題の原因はクリアになりました! 回答を読み終え、 >>上の操作は、アクションメソッド NewTopicSubmit を HTTP 動詞 GET で呼び出しているだけですよね。 ということを知らなかったことが分かったのがとても大きかったです。 また、回答からModelはうまくできているようだということが確信を持つことが出来、以下のご指摘を受けて、スキャフォールディング機能を利用してみたところweb上の入力フォームからデータベースに書き込むことに成功し、歓喜の声を上げてしまいました。本当に丁寧な回答をありがとうございました!! >>Model と DB が上手くできていれば、Visual Studio のスキャフォールディング機能を利用して自力でコードを書かなくても基本的な Controller と View のコードは自動生成されて、今回のような問題に悩む必要はないはずです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問