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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

MVC

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

ASP.NET

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

Q&A

解決済

1回答

2100閲覧

Bind Include で値が挿入されない

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

MVC

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

ASP.NET

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

0グッド

0クリップ

投稿2021/11/18 03:06

編集2021/11/18 07:34

###実現したいこと
現在、簡単な保存機能とログイン機能を備えたウェブサイトをMVCで作成しようとしております。
ブラウザから入力した値(現在はID/パスワード)を受け取ってSQLに保存したいと考えております
###前提
以前に作成したアプリケーションを流用して作成しております。
その時に入力した値はただのテキストです。

発生している問題

ブラウザから入力した値が受け取れずnullになってしまっている

該当のソースコード

C#

1"Controller" 2[HttpPost] 3 public void Add([Bind(Include = "a_id,a_pass,b_id,b_pass,c_id,c_pass")] Memo memo) 4 { 5 //入力未入力の確認 6 List<string> errorMessage = MemoValidation.AddCheck(memo); 7 if (errorMessage.Count != 0) 8 { 9 Session["errorMessageList"] = errorMessage; 10 Response.Redirect("/Memo/Create"); 11 return; 12 } 13 14 MySqlConnection connection = new MySqlConnection(DatabaseUtil.GetConnectionString()); 15 MemoDao dao = new MemoDao(connection); 16 17 Batch_change batch_change = (Batch_change)Session["batch_change"]; 18 //memo.CreatedUserId = batch_change.UserId; 19 //テーブルに登録 20 dao.Create(memo); 21 //画面遷移 22 Response.Redirect("/Memo/List"); 23 }

cshtml

1"View" 2@{ 3 ViewBag.Title = "登録"; 4 var errorMessageList = ViewBag.errorMessageList; 5} 6 7<form action="/Memo/Add" method="post"> 8 <table class="table"> 9 <tr> 10 <th>A</th> 11 <td><b>ID : </b><input type="text" name="a_id" size="25" placeholder="a_IDを入力してください"></td> 12 <td><b>パスワード : </b><input type="password" size="35" name="a_pass" placeholder="aのパスワードを入力してください"></td> 13 </tr> 14 <tr> 15 <th>B</th> 16 <td><b>ID : </b><input type="text" size="25" name="b_id" placeholder="b_IDを入力してください"></td> 17 <td><b>パスワード : </b><input type="password" size="35" name="b_pass" placeholder="bのパスワードを入力してください"></td> 18 </tr> 19 <tr> 20 <th>C</th> 21 <td><b>ID : </b><input type="text" name="c_id" size="25" placeholder="c_IDを入力してください"></td> 22 <td><b>パスワード : </b><input type="password" size="35" name="c_pass" placeholder="cのパスワードを入力してください"></td> 23 </tr> 24 </table> 25 <br>

C#

1"Model" 2using System; 3using System.Collections.Generic; 4using System.Linq; 5using System.Web; 6 7namespace MemoApp.Models 8{ 9 public class Memo 10 { 11 private int? linkagePrimaryKey; 12 private string a_Id; 13 private string a_Pass; 14 private string b_Id; 15 private string b_Pass; 16 private string c_Id; 17 private string c_Pass; 18 19 public Memo() { } 20 21 public Memo(int? linkagePrimaryKey, string a_Id, string a_ePass, string b_Id, string b_Pass, string c_Id, string c_Pass) 22 { 23 this.linkagePrimaryKey = linkagePrimaryKey; 24 this.googleId = a_Id; 25 this.googlePass = a_Pass; 26 this.tabelogId = b_Id; 27 this.tabelogPass = b_Pass; 28 this.gnaviId = c_Id; 29 this.gnaviPass = c_Pass; 30 31 } 32 33 public int? LinkagePrimaryKey { get => linkagePrimaryKey; set => linkagePrimaryKey = value; } 34 public string A_Id { get => a_Id; set => a_Id = value; } 35 public string A_Pass { get => a_Pass; set => a_Pass = value; } 36 public string B_Id { get => b_Id; set => b_Id = value; } 37 public string B_Pass { get => b_Pass; set => b_Pass = value; } 38 public string C_Id { get => c_Id; set => c_Id = value; } 39 public string C_Pass { get => c_Pass; set => c_Pass = value; } 40 } 41}
<input type="submit" value="  保存  " onclick="return confirm('入力内容はお間違いないですか?')" class="btn btn-success center-block text-right" ;> <a href="/Memo/List">戻る</a>
</form> ```

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

開発環境
windows10 home
visualstudio 2022
.NET Framework4.8

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/11/18 03:33

情報不足です。 (1) ASP.NET の話のようですが、であれば ASP.NET のタグをつけてください。 (2) 何を作っているか(Web Forms? MVC? Razor? Web API? その他?)と開発環境(OS, Visual Studio のバージョン、.NET Framework or Core のどっちかとそのバージョンなど)を質問欄を編集して追記してください。 (3) Model と View のコードもアップしてください。 上記 (1) と (2) は前のあなたのスレッドでも言いましたが無視。今回はちゃんとやってください。やらないなら今後あなたのスレッドは無視します。
退会済みユーザー

退会済みユーザー

2021/11/18 04:54

大変申し訳ございません。 ご指摘箇所ですが、修正させて頂きました。 宜しくお願い致します。
退会済みユーザー

退会済みユーザー

2021/11/18 06:03 編集

> .NET Framework6.0 .NET Framework に 6.0 というバージョンはありません。4.8 までです。Entity Framework 6 の間違いですか? 確認して訂正願います。 くどいようですが、Core ではなくて .NET Framework 版で良いのですよね? 質問欄に書かれた View のコードは完全じゃないですよね。しかもスキャフォールディング機能を使ってなくて自力で書いたように見えますが、そうなんですか? Model のコードもプロパティを使ってないし、普通じゃないです。一体何を参考に作っているのですか? データバインドされないのは多分 Model の定義でプロパティを使ってないからだと思います。
退会済みユーザー

退会済みユーザー

2021/11/18 07:35

NET Frameworkに関しては4.8でした。 私の早とちりだったようです。 Viewについて 以前作成した時はこのViewで動いていましたので私としては完全の認識でした。 スキャフォールディング機能の使用有無について 現在まで使用したことがありません。 プロパティ/コンストラクタ/フィールドに差分があったという認識ですが お間違いないでしょうか。
guest

回答1

0

ベストアンサー

以下のようにやってみてください。

Model

必ず以下のようにパブリックプロパティを使うこと。

namespace Mvc5App.Models { public class Memo { public int? LinkagePrimaryKey { get; set; } public string A_Id { get; set; } public string A_Pass { get; set; } public string B_Id { get; set; } public string B_Pass { get; set; } public string C_Id { get; set; } public string C_Pass { get; set; } } }

Controller

ユーザー入力を検証して、検証結果 NG の場合にユーザーに差し戻して再入力を促すために、以下のような形にして、View に Model を渡すのは必須。

using System.Web.Mvc; namespace Mvc5App.Controllers { public class HomeController : Controller { public ActionResult Add() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Add(Memo memo) { if (ModelState.IsValid) { // DB へ登録 return RedirectToAction("Index"); } return View(memo); } } }

View

スキャフォールディング機能を使って、表示されるメニューでテンプレートは Create を選択、モデルクラス は Meme を選択して自動生成させた View。LinkagePrimaryKey は表示不要らしいのでコメントアウト。

@model Mvc5App.Models.Memo に注目。上に定義した Model の Memo クラスを渡しています。

@model Mvc5App.Models.Memo @{ ViewBag.Title = "Add"; } <h2>Add</h2> @using (Html.BeginForm()) { @Html.AntiForgeryToken() <div class="form-horizontal"> <h4>Memo</h4> <hr /> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) @*<div class="form-group"> @Html.LabelFor(model => model.LinkagePrimaryKey, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.LinkagePrimaryKey, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.LinkagePrimaryKey, "", new { @class = "text-danger" }) </div> </div>*@ <div class="form-group"> @Html.LabelFor(model => model.A_Id, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.A_Id, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.A_Id, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.A_Pass, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.A_Pass, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.A_Pass, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.B_Id, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.B_Id, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.B_Id, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.B_Pass, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.B_Pass, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.B_Pass, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.C_Id, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.C_Id, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.C_Id, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.C_Pass, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.C_Pass, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.C_Pass, "", 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") }

Visual Studio から実行して以下のように入力し、[Create]ボタンをクリックするとユーザーが入力したデータは [HttpPost] 属性を付与した Add アクションメソッドに送信され、

イメージ説明

以下の通りデータバインドされる。

イメージ説明

Bind Include というのはオーバーポスティング防止のためのセキュリティ対策で、無くてもデータバインドはされます。

投稿2021/11/18 07:08

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2021/11/18 07:36

とても詳しく解説して頂きありがとうございます。 自分の稚拙さが恥ずかしい限りです。 今後ともよろしくお願い致します。
退会済みユーザー

退会済みユーザー

2021/11/19 02:08

本を買って体系的に知識を付けることをお勧めします。独学は問題ないですが、自己流は問題ありだと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問