今日もちょいつか

お酒の飲み過ぎか、それとも歳のせいなのか毎日ちょっぴり疲れ気味なフリーのソフト屋です。ソフト開発の話題をblogにしてみます。

ASP.NET Core MVC MySQLのテーブルの内容をDropDownListにしてみた

Webシステムの開発をしていると、テーブルの内容をDropDownListにすることは
よくあることです。マスターデータなんか特にそうですよね。
で、ASP.NET Core MVCのことを色々と考えたり調べたりするのに飽きたので
サクッとコードを書いて、動いたーって喜んでみようと
DropDownListを試してみました。
そーしたら予想外にまたまたハマってしまいました。
まったく、初めてのことはことごとくハマってしまっています。

色々と苦労した結果動いたソース群を記しておきます。
いつものごとく、Visual Studio Community 2017 for Mac で動作確認しています。
自分なりにがんばってみた結果ですので、ASP.NET Core MVCの作法に合っているか不明です。
あくまでも参考程度にしてください。

やりたいことは、
Entity Frameworkを使ってMySQLのテーブルのデータを取得して
DropDownListを表示したい。

DropDownListに表示させたいModel

    public class ItemGrp
    {
        public int Id { get; set; }
        public string ItemGrpName { get; set; }
    }

DropDownList用のViewModelを作成

DropDownListに表示させるためにはViewModelが必要だったのです。
POSTで受け取った時の値も入ります。

    public class ItemGrpViewModel
    {
        [Required]
        public int ItemGrpList { get; set; }
    }

Controllerを準備します

DbContextからItemGrpのidと名称をを取得して、ViewBagへセットします。

        public IActionResult Index()
        {
            ViewBag.SelectOptions = _context.ItemGrp.ToArray().Select(m =>
            new SelectListItem() { Value = m.Id.ToString(), Text = m.ItemGrpName });                                                                      

            return View();
        }

Viewsを準備します

最後にViewへ @Html.DropDownListFor を使って表示します。

    @Html.DisplayNameFor(model => model.ItemGrpList)
    @Html.DropDownListFor(
      model => model.ItemGrpList,
      (IEnumerable<SelectListItem>)ViewBag.SelectOptions,
      " 選択してください ", 
      new { @class = "form-control" } )

最終的にDropDownListに対応するViewModelを準備することで
動いてくれましいた。
ViewをFormタグでくくって、POSTでサーバーへ渡した時に

        [HttpPost]
        public IActionResult Index(ItemGrpViewModel model)

このように、
コンストラクタにViewModelを定義することで値が取得できることもわかりました。
やっぱりViewにはバインドさせるModelが必要なのですね。

仕事の気分転換に、自立式ハンモック

以前からハンモックに憧れていたのですが。
屋内で使える自立式ハンモックがあるのですね。
どんなのが良いのかわからないので、1万円を切るくらいのを買ってみました。
想像していたより気持ちがいいです。
特に左右に揺らすととても気分が癒やされます。
プログラムでハマった時に気持ちを落ち着けることができそうです。