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

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

ただいまの
回答率

88.60%

ASP.NET MVCでDropdownlistの初期値設定方法(DBから取得)

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 10K+

blackdifferent

score 25

こんにちわ!
ASP.NET MVC Frameworkで勤務表を作成しています(Visualstudio 2017, C#,entity framework)。
DropdownlistでDBのテーブルからリストを表示し、選択項目をDBの別のテーブルへ保存する機能のところで困っています。
一応以下のコードで選択肢表示と選択項目の保存が出来るようになりましたが、初期値の表示が出来ません。
選択した項目はInt型でDBに保存して、選択項目のテーブルでString型に置き換えて表示したいです。
よろしくお願いします。

コントローラ:

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 Kintai_CS_.Models;

namespace Kintai_CS_.Controllers
{
    public class TKintaisController : Controller
    {
        private mvcdbEntities db = new mvcdbEntities();

        // GET: TKintais
        public ActionResult Index()
        {
            // 選択ボックスのオプションを準備
            ViewBag.ServerOptions = db.TSituation.Select(s => new SelectListItem
            {
                Text = s.situation,
                Value = s.id.ToString()
            });

            return View(db.TKintai.ToList());
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Index(List<TKintai> products)
        {
            foreach(var kintai in products)
            {
                TKintai sv_product = db.TKintai.Find(kintai.id);
                sv_product.open = kintai.open;
                sv_product.close = kintai.close;
                sv_product.rest = kintai.rest;
                sv_product.situation = kintai.situation;
                sv_product.remark = kintai.remark;
                if (kintai.open != null && kintai.close != null && kintai.rest != null)
                {
                    kintai.worktime = kintai.close - kintai.open - kintai.rest;
                    kintai.overtime = kintai.worktime - TimeSpan.FromHours(8);
                }
            }
            db.SaveChanges();
            return RedirectToAction("Index");
        }                   
    }
}


ビュー:

@model List<Kintai_CS_.Models.TKintai>

@{
    /**/

    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Index</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <table class="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>
                補助
            </th>
            <th>
                remark
            </th>
        </tr>



        @for (int i = 0; i < Model.Count; i++)
        {
            int idx = i;
            <tr>

                <td>
                    @Html.DisplayFor(model => model[idx].id)
                    @Html.HiddenFor(model => model[idx].id)
                </td>
                <td>
                    @Html.DisplayFor(model => model[idx].week)
                    @Html.HiddenFor(model => model[idx].week)
                </td>
                <td>
                    @Html.EditorFor(model => model[idx].open, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model[idx].open, "", new { @class = "text-danger" })
                </td>
                <td>
                    @Html.EditorFor(model => model[idx].close, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model[idx].close, "", new { @class = "text-danger" })
                </td>
                <td>
                    @Html.EditorFor(model => model[idx].rest, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model[idx].rest, "", new { @class = "text-danger" })
                </td>
                <td>
                    @Html.DisplayFor(model => model[idx].worktime)
                    @Html.HiddenFor(model => model[idx].worktime)
                </td>
                <td>
                    @Html.DisplayFor(model => model[idx].overtime)
                    @Html.HiddenFor(model => model[idx].overtime)
                </td>
                <td>                   
                  **  @Html.DropDownListFor(model => model[idx].situation, (IEnumerable<SelectListItem>)ViewBag.ServerOptions, "選択してください", new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model[idx].situation, "", new { @class = "text-danger" })**
                </td>
                <td style="width: 66px">
                    <nobr>
                        <button type="button" onclick="location.href='@Url.Action("BtnClick","Kintai")'"></button>

                    </nobr>

                </td>
                <td>
                    @Html.EditorFor(model => model[idx].remark, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model[idx].remark, "", new { @class = "text-danger" })
                </td>

            </tr>

        }
    </table>
    <p>
        <input type="submit" value="更新" />
    </p>
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

普通に考えると(あくまでも自分的にですが)こんな感じで実装するという例を書いておきます。質問者さんの DB の構造は分かりませんし、アップしてあるコードに応用できるかは分かりませんが。

以下は Microsoft が提供しているサンプルデータベース Northwind から Visual Studio のウィザードを利用して作った EDM の一部分です。

イメージ説明

Products テーブルの SupplierID は数字です。Products テーブルのレコードを Edit する際、SupplierID はテキストボックスに数字を表示するのではなく、ドロップダウンリストに供給者名を文字列で表示するとします。以下のブラウザ画面のような感じです(ドロップダウンリストを開いたところです)。

イメージ説明

一番上の EDM の画像に示すように Northwind には Products テーブル他に Suppliers というテーブルがあり、その主キー SupplierID から Products テーブルの SupplierID に外部キー制約が張られています。

EDM 画像の Products というのが質問者さんのケースでは TKintai で、SupplierID が situation に該当すると考えてください。質問者さんの DB に、Suppliers テーブルに該当する situation テーブルというのが存在するのかどうか分かりませんが、下のコードはそれがあることが前提です。

上のブラウザ画面のコードは以下の通りです。ViewBag を使って SelectList を View に渡し、@Html.DropDownList を使って表示しているところがポイントです。

質問者さんの DB に、Suppliers テーブルに該当する situation テーブルというのが存在しなければ、何らかの手段で db.Suppliers と同等なオブジェクトを作成して使うことになると思います。

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 Mvc5App;

namespace Mvc5App.Controllers
{
    public class ProductsController : Controller
    {
        private NORTHWINDEntities db = new NORTHWINDEntities();

        // ・・・中略・・・

        // GET: Products/Edit/5
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Products products = db.Products.Find(id);
            if (products == null)
            {
                return HttpNotFound();
            }
            ViewBag.CategoryID = new SelectList(db.Categories, "CategoryID", "CategoryName", products.CategoryID);
            ViewBag.SupplierID = new SelectList(db.Suppliers, "SupplierID", "CompanyName", products.SupplierID);
            return View(products);
        }

        // POST: Products/Edit/5
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "ProductID,ProductName,SupplierID,CategoryID,QuantityPerUnit,UnitPrice,UnitsInStock,UnitsOnOrder,ReorderLevel,Discontinued")] Products products)
        {
            if (ModelState.IsValid)
            {
                db.Entry(products).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.CategoryID = new SelectList(db.Categories, "CategoryID", "CategoryName", products.CategoryID);
            ViewBag.SupplierID = new SelectList(db.Suppliers, "SupplierID", "CompanyName", products.SupplierID);
            return View(products);
        }

        // ・・・中略・・・

    }
}

View

@model Mvc5App.Products

@{
    ViewBag.Title = "Edit";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Edit</h2>


@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Products</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        @Html.HiddenFor(model => model.ProductID)

        <div class="form-group">
            @Html.LabelFor(model => model.ProductName, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.ProductName, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.ProductName, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.SupplierID, "SupplierID", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownList("SupplierID", null, htmlAttributes: new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.SupplierID, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.CategoryID, "CategoryID", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownList("CategoryID", null, htmlAttributes: new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.CategoryID, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.QuantityPerUnit, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.QuantityPerUnit, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.QuantityPerUnit, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.UnitPrice, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.UnitPrice, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.UnitPrice, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.UnitsInStock, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.UnitsInStock, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.UnitsInStock, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.UnitsOnOrder, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.UnitsOnOrder, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.UnitsOnOrder, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.ReorderLevel, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.ReorderLevel, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.ReorderLevel, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Discontinued, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                <div class="checkbox">
                    @Html.EditorFor(model => model.Discontinued)
                    @Html.ValidationMessageFor(model => model.Discontinued, "", new { @class = "text-danger" })
                </div>
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}


上記コードは以下の記事の手順で全て Visual Stidio 2015 に自動生成させたものをコピペしただけです。一度、このように作ってみてはいかがですか? 今後の参考になると思います。

スキャフォールディング機能
http://surferonwww.info/BlogEngine/post/2017/07/23/creating-controller-and-view-in-mvc-using-scaffolding-function.aspx

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/03 17:40

    > 制作中のコードですとリストで渡しているため、SelectList内で選択項目を指定するのが出来なさそうです。

    意味が分かりません。SelectList を渡せるように変更すれば済む話だと思うのですが?

    > ビュー側で選択項目を指定する方法はありますでしょうか?

    普通のやり方でやる方法は自分は知りません。項目は渡せるでしょうから、JavaScript でなんちゃらするということは可能かもしれません。でも、そこまでやるの? SelectList を渡すようにすべきじゃないの?・・・って思います。

    キャンセル

  • 2018/12/04 08:55

    質問者さんのケース(複数行の一括更新・・・個人的にはかなり乱暴なような気もしますが)の場合に SelectList を ViewBag 経由で View に渡すにはどうするかを考えてみましたので、回答欄に追記しておきます。

    キャンセル

  • 2018/12/04 09:34

    文字数制限があるのか、最初の回答欄には追記できなかったので、新たに別の回答欄を設けてそこに書きました。

    キャンセル

checkベストアンサー

+1

【追伸】

最初の回答の 2018/12/04 08:55 の私のコメントで「質問者さんのケース(複数行の一括更新・・・個人的にはかなり乱暴なような気もしますが)で SelectList を ViewBag 経由で View に渡すにはどうするかを考えてみました・・・」と書きましたが、それを以下に書いておきます。

Dictionary<int, SelectList> 型のディクショナリを作り(key が situation に該当)、それを ViewBag 経由 View に渡し、ディクショナリの中から key が situation に該当する SelectList を取得して @Html.DropDownLsit の第 2 引数に渡してやります。

イメージ説明

編集後 POST したときにモデルバインディングが期待通り行われるように、 @Html.DropDownLsit の第 1 引数にも一工夫必要ですので注意してください。

上の画像のコードは以下の通りです。

Model

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;

namespace Mvc5App.Models
{
    public class KintaiModel
    {
        public IList<TKintai> Kintais { get; set; }
    }

    public class TKintai
    {
        public int Id { set; get; }
        public string Week { set; get; }
        public string Open { set; get; }
        public string Close { set; get; }
        public string Rest { set; get; }
        public string Worktime { set; get; }
        public string Overtime { set; get; }
        public int Situation { set; get; }
        public string Remark { set; get; }
    }

    public class TSituation
    {
        public int ID { set; get; }
        public string Situation { set; get; }
    }
}

Controller / Action Method

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.ComponentModel.DataAnnotations;
using Mvc5App.Models;

namespace Mvc5App.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult EditKintai()
        {
            KintaiModel model = new KintaiModel();
            model.Kintais = new List<TKintai>
            {
                new TKintai { Id = 1, Week = "w1", Open = "o1", Close = "c1", Rest = "rs1", Worktime = "w1", Overtime = "o1" , Situation = 1, Remark = "rm1" },
                new TKintai { Id = 2, Week = "w2", Open = "o2", Close = "c2", Rest = "rs2", Worktime = "w2", Overtime = "o2" , Situation = 2, Remark = "rm2" },
                new TKintai { Id = 3, Week = "w3", Open = "o3", Close = "c3", Rest = "rs3", Worktime = "w3", Overtime = "o3" , Situation = 3, Remark = "rm3" }
            };

            List<TSituation> situations = new List<TSituation>
            {
                new TSituation { ID = 1, Situation = "状態1" },
                new TSituation { ID = 2, Situation = "状態2" },
                new TSituation { ID = 3, Situation = "状態3" }
            };

            Dictionary<int, SelectList> dictionary = new Dictionary<int, SelectList>
            {
                { 1, new SelectList(situations, "ID", "Situation", 1) },
                { 2, new SelectList(situations, "ID", "Situation", 2) },
                { 3, new SelectList(situations, "ID", "Situation", 3) }
            };

            ViewBag.Situation = dictionary;

            return View(model);
        }

        [HttpPost]
        public ActionResult EditKintai(KintaiModel model)
        {
            if(ModelState.IsValid)
            {
                // DB の編集処理
                return RedirectToAction("Index");
            }
            return View(model);
        }
    }
}

View

@model Mvc5App.Models.KintaiModel

@{
    ViewBag.Title = "EditKintai";
    Layout = "~/Views/Shared/_Layout.cshtml";

    Dictionary<int, SelectList> dictionary = (Dictionary<int, SelectList>)ViewBag.Situation;
}

<h2>EditKintai</h2>


@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>KintaiModel</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })

        <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>
                @for (int i = 0; i < Model.Kintais.Count; i++)
                {
                    <tr>
                        <td>
                            <div class="editor-field">
                                @Html.TextBoxFor(model => model.Kintais[i].Id, new { style = "width:60px" })
                                @Html.ValidationMessageFor(model => model.Kintais[i].Id)
                            </div>
                        </td>
                        <td>
                            <div class="editor-field">
                                @Html.TextBoxFor(model => model.Kintais[i].Week, new { style = "width:60px" })
                                @Html.ValidationMessageFor(model => model.Kintais[i].Week)
                            </div>
                        </td>
                        <td>
                            <div class="editor-field">
                                @Html.TextBoxFor(model => model.Kintais[i].Open, new { style = "width:60px" })
                                @Html.ValidationMessageFor(model => model.Kintais[i].Open)
                            </div>
                        </td>
                        <td>
                            <div class="editor-field">
                                @Html.TextBoxFor(model => model.Kintais[i].Close, new { style = "width:60px" })
                                @Html.ValidationMessageFor(model => model.Kintais[i].Close)
                            </div>
                        </td>
                        <td>
                            <div class="editor-field">
                                @Html.TextBoxFor(model => model.Kintais[i].Rest, new { style = "width:60px" })
                                @Html.ValidationMessageFor(model => model.Kintais[i].Rest)
                            </div>
                        </td>
                        <td>
                            <div class="editor-field">
                                @Html.TextBoxFor(model => model.Kintais[i].Worktime, new { style = "width:60px" })
                                @Html.ValidationMessageFor(model => model.Kintais[i].Worktime)
                            </div>
                        </td>
                        <td>
                            <div class="editor-field">
                                @Html.TextBoxFor(model => model.Kintais[i].Overtime, new { style = "width:60px" })
                                @Html.ValidationMessageFor(model => model.Kintais[i].Overtime)
                            </div>
                        </td>
                        <td>
                            <div class="editor-field">
                                @*@Html.TextBoxFor(model => model.Kintais[i].Situation, new { style = "width:60px" })*@
                                @Html.DropDownList("Kintais[" + i + "].Situation", dictionary[Model.Kintais[i].Situation])
                                @Html.ValidationMessageFor(model => model.Kintais[i].Situation)
                            </div>
                        </td>
                        <td>
                            <div class="editor-field">
                                @Html.TextBoxFor(model => model.Kintais[i].Remark, new { style = "width:80px" })
                                @Html.ValidationMessageFor(model => model.Kintais[i].Remark)
                            </div>
                        </td>
                    </tr>

                }
            </table>
        </fieldset>
                <div class="form-group">
                    <div class="col-md-offset-2 col-md-10">
                        <input type="submit" value="Save" class="btn btn-default" />
                    </div>
                </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

【追伸】

下の 2018/12/06 12:12 の私のコメントで「こうしてみてはどうかという案を回答欄に追記しておきます」と書きましたが、それを以下に書いておきます。

コメントにも書きましたが、検証等はしておりませんので参考にとどめ、自力で必要な修正等を行ってコードを書いてください。

質問者さんの Controller のコードの中の、

// 選択ボックスのオプションを準備
ViewBag.ServerOptions = db.TSituation.Select(s => new SelectListItem
{
    Text = s.situation,
    Value = s.id.ToString()
});

を以下のように変更して、

List<TSituation> situations = db.TSituation.ToList();
Dictionary<int, SelectList> dictionary = new Dictionary<int, SelectList>();

foreach (TSituation item in situations)
{
    dictionary.Add(item.ID, new SelectList(situations, "ID", "Situation", item.ID));
}

ViewBag.Situation = dictionary;

View を以下のようにしたらどうなりますか?

@model List<Kintai_CS_.Models.TKintai>

@{
    /**/

    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";

    Dictionary<int, SelectList> dictionary = (Dictionary<int, SelectList>)ViewBag.Situation;
}

・・・略・・・

@Html.DropDownList("<name 属性に指定する名前>", dictionary[Model[idx].Situation])

・・・略・・・

(注)上のコードの <name 属性に指定する名前> は EditorFor を使った際にどのようになるか調べて、同じになるように設定してください

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/06 10:24

    そうですね。質問コードでEditorForの一覧表示と編集後のモデルバインディングは出来ていました。
    Dropdownlistで選択肢表示は出来るものの、過去に保存した項目をDropdownlistの初期値として表示することが出来なかったため質問させていただきました。
    もう少しDictionary型やViewBagについて勉強し、実装できないか確認したいと思います。

    キャンセル

  • 2018/12/06 12:12

    こうしてみてはどうかという案を回答欄に追記しておきます。検証等はしておりませんので参考にとどめ、自力で必要な修正等を行ってコードを書いてください。

    キャンセル

  • 2018/12/06 13:33

    ありがとうございます。出来ました。
    DropDownList()だとバインドがされなかったので、DropDownListFor()にしたところ全てうまく機能しました。
    本当にありがとうございました。後で最終的なコードもアップしようと思います。

    キャンセル

+1

SurferOnWwwさんの回答にて解決しました。
最終的なコードをこちらに載せます。

コントローラ:

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 Kintai_CS_.Models;

namespace Kintai_CS_.Controllers
{
    public class TKintaisController : Controller
    {
        private mvcdbEntities db = new mvcdbEntities();

        // GET: TKintais
        public ActionResult Index()
        {
            //選択ボックスのオプションを準備           
            List<TSituation> situations = db.TSituation.ToList();
            Dictionary<int, SelectList> dictionary = new Dictionary<int, SelectList>();

            foreach (TSituation item in situations)
            {
                dictionary.Add(item.id, new SelectList(situations, "ID", "Situation", item.id));
            }
            ViewBag.Situation = dictionary;               

            return View(db.TKintai.ToList());
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Index(List<TKintai> products)
        {
            foreach(var kintai in products)
            {
                TKintai sv_product = db.TKintai.Find(kintai.id);
                sv_product.open = kintai.open;
                sv_product.close = kintai.close;
                sv_product.rest = kintai.rest;
                sv_product.situation = kintai.situation;
                sv_product.remark = kintai.remark;
                if (kintai.open != null && kintai.close != null && kintai.rest != null)
                {
                    kintai.worktime = kintai.close - kintai.open - kintai.rest;
                    kintai.overtime = kintai.worktime - TimeSpan.FromHours(8);
                }
            }
            db.SaveChanges();
            return RedirectToAction("Index");
        }


        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}


ビュー:

@model IList<Kintai_CS_.Models.TKintai>

@{
    /**/

    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";


    Dictionary<int, SelectList> dictionary = (Dictionary<int, SelectList>)ViewBag.Situation;
}

        <h2>Index</h2>

        @using (Html.BeginForm())
        {
            @Html.AntiForgeryToken()

            <table class="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>
                        補助
                    </th>
                    <th>
                        remark
                    </th>
                </tr>

                @for (int i = 0; i < Model.Count; i++)
                {
                    int idx = i;
                    <tr>
                        <td>
                            @Html.DisplayFor(model => model[idx].id)
                            @Html.HiddenFor(model => model[idx].id)
                        </td>
                        <td>
                            @Html.DisplayFor(model => model[idx].week)
                            @Html.HiddenFor(model => model[idx].week)
                        </td>
                        <td>
                            @Html.EditorFor(model => model[idx].open, new { htmlAttributes = new { @class = "form-control" } })
                            @Html.ValidationMessageFor(model => model[idx].open, "", new { @class = "text-danger" })
                        </td>
                        <td>
                            @Html.EditorFor(model => model[idx].close, new { htmlAttributes = new { @class = "form-control" } })
                            @Html.ValidationMessageFor(model => model[idx].close, "", new { @class = "text-danger" })
                        </td>
                        <td>
                            @Html.EditorFor(model => model[idx].rest, new { htmlAttributes = new { @class = "form-control" } })
                            @Html.ValidationMessageFor(model => model[idx].rest, "", new { @class = "text-danger" })
                        </td>
                        <td>
                            @Html.DisplayFor(model => model[idx].worktime)
                            @Html.HiddenFor(model => model[idx].worktime)
                        </td>
                        <td>
                            @Html.DisplayFor(model => model[idx].overtime)
                            @Html.HiddenFor(model => model[idx].overtime)
                        </td>
                        <td>                           
                            @Html.DropDownListFor(model => model[idx].situation, dictionary[Model[idx].situation], new { htmlAttributes = new { @class = "form-control" } })
                        </td>
                        <td style="width: 66px">
                            <nobr>
                                <button type="button" onclick="location.href='@Url.Action("BtnClick","Kintai")'"></button>
                            </nobr>

                        </td>
                        <td>
                            @Html.EditorFor(model => model[idx].remark, new { htmlAttributes = new { @class = "form-control" } })
                            @Html.ValidationMessageFor(model => model[idx].remark, "", new { @class = "text-danger" })
                        </td>

                    </tr>

                }
            </table>
            <p>
                <input type="submit" value="更新" />
            </p>
        }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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