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

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

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

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

ASP.NET MVC Framework

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

Q&A

解決済

1回答

13180閲覧

ASP.NET MVC5でリストをビューからコントローラへ渡す方法

blackdifferent

総合スコア25

C#

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

ASP.NET MVC Framework

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

0グッド

0クリップ

投稿2018/11/27 06:23

編集2019/01/08 01:49

前提・実現したいこと

ASP.NET MVCでWeb勤務表を作成しています。
DBから読み込んだデータ(日時、出勤時間等)をリスト表示するところまでは出来ましたが、そのデータをエディットで変更してDBを書き換えるところがわかりません(PostでViewからリストを受け取れない)。
詳細はソースコードに記します。

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

エラーメッセージ

該当のソースコード

MODEL:

namespace MvcShopping.Models { /// <summary> /// 勤務表情報のモデルクラス /// </summary> public class KintaiModel { //勤務表リスト public IQueryable<TKintai> Kintais { get; set; } } }

CONTROLLER:

namespace MvcShopping.Controllers { public class KintaiController : Controller { // // GET: /Kintai/ public ActionResult Index() { // web.config から接続文字列を取得 string cnstr = ConfigurationManager.ConnectionStrings[ "mvcdbConnectionString"].ConnectionString; // データベースに接続する DataContext dc = new DataContext(cnstr); // 商品一覧を取得 var list = from p in dc.GetTable<TKintai>() select p; return View(list); } // // POST: /Admin/Edit/5 [HttpPost] public ActionResult Index(KintaiModel kintai) { try { // web.config から接続文字列を取得 string cnstr = ConfigurationManager.ConnectionStrings[ "mvcdbConnectionString"].ConnectionString; // データベースに接続する DataContext dc = new DataContext(cnstr); var list = from p in dc.GetTable<TKintai>() select p; return RedirectToAction("Index"); } catch { return View(); } } } }

View:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<MvcShopping.Models.TKintai>>" %> <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> Index </asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <form id="form1" runat="server"> <h2> Index</h2> <% using (Html.BeginForm()) {%> <%: Html.ValidationSummary(true) %> <fieldset> <legend>Fields</legend> <table> <tr> <th> id </th> <th> week </th> <th> open </th> <th> close </th> <th> rest </th> <th> worktime </th> <th> overtime </th> <th> situation </th> <th> remark </th> </tr> <% foreach (var item in Model) { %> <tr> <td> <div class="editor-field"> <%: Html.TextBoxFor(model => item.id, new { style = "width:60px" })%> <%: Html.ValidationMessageFor(model => item.id) %> </div> <%--<div class="display-field"> <%: item.id %></div>--%> </td> <td> <div class="editor-field"> <%: Html.TextBoxFor(model => item.week, new { style = "width:60px" })%> <%: Html.ValidationMessageFor(model => item.week) %> </div> <%-- <div class="display-field"> <%: item.week %></div>--%> </td> <td> <div class="editor-field"> <%: Html.TextBoxFor(model => item.open, new { style = "width:60px" })%> <%: Html.ValidationMessageFor(model => item.open) %> </div> </td> <td> <div class="editor-field"> <%: Html.TextBoxFor(model => item.close, new { style = "width:60px" })%> <%: Html.ValidationMessageFor(model => item.close) %> </div> </td> <td> <div class="editor-field"> <%: Html.TextBoxFor(model => item.rest, new { style = "width:60px" })%> <%: Html.ValidationMessageFor(model => item.rest) %> </div> </td> <td> <div class="editor-field"> <%: Html.TextBoxFor(model => item.worktime, new { style = "width:60px" })%> <%: Html.ValidationMessageFor(model => item.worktime) %> </div> </td> <td> <div class="editor-field"> <%: Html.TextBoxFor(model => item.overtime, new { style = "width:60px" })%> <%: Html.ValidationMessageFor(model => item.overtime) %> </div> </td> <td> <div class="editor-field"> <%: Html.TextBoxFor(model => item.situation, new { style = "width:60px" })%> <%: Html.ValidationMessageFor(model => item.situation) %> </div> </td> <td> <div class="editor-field"> <%: Html.TextBoxFor(model => item.remark, new { style = "width:80px" })%> <%: Html.ValidationMessageFor(model => item.remark) %> </div> </td> </tr> <% } %> </table> <p> <input type="submit" value="更新" /> </p> </fieldset> <% } %> </form> </asp:Content>

試したこと

ここに問題に対して試したことを記載してください。

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

※VisualStudio2010,C#

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/11/27 06:50

コードは ``` と ``` で囲ってください。インデントされて見やすくなりますので。
退会済みユーザー

退会済みユーザー

2018/11/27 06:51

MVC2 のタグが付いてますが、間違いないですか? VS2010 の場合 MVC4 までサポートしているはずですが・・・ もし間違いならタグを付け直してください。
blackdifferent

2018/11/27 14:44

'''でコードを囲いましたが、インデントされません。
退会済みユーザー

退会済みユーザー

2018/11/27 23:11

文字が違います。よく見てください。
退会済みユーザー

退会済みユーザー

2018/11/27 23:13

2 つ目のコメントに対する答えは、MVC2 で正しいということ?
guest

回答1

0

ベストアンサー

そのデータをエディットで変更してDBを書き換えるところがわかりません(PostでViewからリストを受け取れない)。

スレッドの表題「ビューからコントローラへ渡す方法」すなわち「PostでViewからリストを受け取れない」というところのみがこのスレッドで質問者さんが解決したい問題・課題だと理解して回答します。

(今質問に書かれているアクションメソッドのコードでは、受け取ることができても DB の書き換えはできなそうですが、それはこのスレッドの表題とは違いますので、もしその点に関して質問があれば新たに別のスレッドを立てて質問してください)

質問にアップされている Model のコード中の TKintai が定義不明ですが、View のコードにある id, week, open ... 等をパブリックプロパティに持つクラスで、TKintai のコレクションをモデルバインディングしたいのだと理解します。

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

具体的には、name="prefix[index].Property" というパターンにします。prefix の部分には質問者さんのケースでは Kintais になります。index は 0 から始まる連番です。

そのために、以下のようにコードを修正してください。

(1) Model のコードで、まず KintaiModel の Kintais プロパティが返す型 IQueryable<TKintai> を IList<TKintai> に変更してください。これは上に書いた [index] のように設定するため必要です。

public class KintaiModel { //勤務表リスト public IList<TKintai> Kintais { get; set; } }

(2) GET 側のアクションメソッド Index では、上の Model に定義される KintaiModel クラスのオブジェクトを作って、それをモデルとして View に渡すようにしてください。(IEnumerable<TKintai> ではなくて)

(3) View のコードを変更して、KintaiModel クラスのオブジェクトを受け取るようにしてください(Inherits 属性を変更)

さらに、TextBoxFor から input type="text" name="prefix[index].Property" という形の html ソースがレンダリングされるようにします。具体的には以下のようにしてください。

for (int i = 0; i < Model.Kintais.Count; i++) { ・・・略・・・ <%: Html.TextBoxFor(model => model.Kintais[i].id, new { style = "width:60px" })%> ・・・略・・・ }

(4) 最後に、POST 側のアクションメソッド Index の仮引数は model にしておいてください(必須ではありませんが、Kintais と紛らわしいので。ちなみに、Kintais とか kintais にするとモデルバインドに失敗します)。

[HttpPost] public ActionResult Index(KintaiModel model) { ・・・略・・・ }

デバッガで、上のアクションメソッドの最初の行あたりにブレークポイントを設定して止めて、引数の model の内容を確認してください。

投稿2018/11/28 05:41

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

blackdifferent

2018/11/28 06:33

回答ありがとうございます。 型 IQueryable を IListに変更することでリストオブジェクトを渡すことが出来ました。 今はPostで受け取ったリストをデータベースへ書き込む方法を調べています。 またわからなかったら質問させていただきます。
blackdifferent

2018/11/29 05:34

すみません。ポストしたリストアイテムのDBの書き換えについて教えていただけますか? 別でスレッドも立てたのですが、なかなか回答を得られなくて。。。 よろしくお願いします。
退会済みユーザー

退会済みユーザー

2018/11/29 05:44

別スレッドは拝見しましたが、今やほとんど使われてない Linq to SQL は自分的にはもう忘却の彼方という感じなので、手が出せないです。お役に立てずすみませんが、他の方の回答をお待ちください。
blackdifferent

2018/11/29 06:06

Linq to SQLはほとんど使われてないのですね。 ありがとうございました。他の方法がないか試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問