読者です 読者をやめる 読者になる 読者になる

miso_soup3 Blog

主に ASP.NET 関連について書いています。

ASP.NET MVC DropDownList

ドロップダウンリストを表示する時、Controller側で
SelectListとSelectListItemのどちらを使えばよいかわからなかった。

結論

どちらでもいい。
けど、IEnumerableを使った方が後々良いかも。

SelectList使う

Controller

    [HttpGet]
        public ActionResult Index()
        {
            IEnumerable<FoodView> foods = GetFoods();

            var view = new PersonDetailsView();
            view.FoodSelectList = new SelectList(foods, "Id", "Name");
            
            return View(view);
        }

        private IEnumerable<FoodView> GetFoods()
        {
            IList<FoodView> foods = new List<FoodView>()
            {
                new FoodView() { Id = 1, Name = "りんご" } ,
                new FoodView() { Id = 2, Name = "じゃがいも" }
            };

            return foods;
        }

IEnumerable使う

Controller

    [HttpGet]
        public ActionResult Index()
        {
            IEnumerable<FoodView> foods = GetFoods();

            var view = new PersonDetailsView();
            view.FoodSelectList = foods.Select(f => 
                new SelectListItem() { Value = f.Id.ToString(), Text = f.Name });
            
            return View(view);
        }

Viewは2つともこれ

@Html.DropDownListFor(m => m.FavoriteFoodId, Model.FoodSelectList)

valueとtextの指定方法においては、IEnumerableがいいかもしれない。
あと拡張メソッドにすれば、きれいすっきり。
「選択なし」の項目を含めるかそうでないかも、すっきりかける。

拡張メソッドやその他もろもろは、ここにのってた

あと、SelectListとSelectListItemの関係。
SelectList -- MultiSelectList -- IEnumerable でした。

ほか

Postした後に、検証失敗等で画面に戻るときに、SelectListItemがnullになる件。
またデータをひっぱってくるか、TempDataを利用するか? 
フィルタ属性…まではいかなくてもいいかも。