記事詳細


投稿日
2025年10月13日12時58分
タイトル

ドロップダウンリストをViewに作成

内容

このコードは、C#のLINQを使用してデータベースからジャンル名を取得し、それをビューで使用するために整形している処理です。以下に詳しく解説します。

1. クエリの作成

IQueryable<string> genreQuery = from r in _context.skyGenre

                                where r.Name != string.Empty

                                orderby r.Name

                                select r.Name;

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

  • context.skyGenre: データベースのテーブル(skyGenre)を表しています。_contextは通常、Entity Framework Coreのデータベースコンテキストです。
  • where r.Name != string.Empty: Name列が空文字列でないレコードをフィルタリングしています。
  • orderby r.Name: Name列でアルファベット順に並べ替えています。
  • select r.Name: Name列の値だけを選択しています。
  • IQueryable<string>: 遅延評価されるクエリが作成されます。この時点ではまだデータベースにクエリは実行されていません。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

2. 重複を排除してリストに変換

var genrename = genreQuery.Distinct().ToList()

    .Select(c => new Microsoft.AspNetCore.Mvc.Rendering.SelectListItem

    {

        Value = c,

        Text = c,

    });

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

  • Distinct(): 重複するジャンル名を排除します。
  • ToList(): クエリを実行し、データベースから結果を取得してリストに変換します。この時点でデータベースにアクセスが発生します。
  • Select(c => new SelectListItem { ... }): 各ジャンル名をSelectListItemオブジェクトに変換します。
    • Value = c: 選択肢の値(Value)にジャンル名を設定。
    • Text = c: 表示テキスト(Text)にもジャンル名を設定。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

3. ViewDataに格納

ViewData["GenreName"] = genrename;

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

  • ViewData: コントローラーからビューにデータを渡すための辞書型オブジェクトです。
  • "GenreName": ビューで使用する際のキー名。
  • genrename: 整形されたジャンル名のリスト(SelectListItemのコレクション)を格納。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

全体の流れ

  1. データベースからジャンル名を取得。
  2. 空文字列を除外し、アルファベット順に並べ替え。
  3. 重複を排除し、リストに変換。
  4. ビューで使用するためにSelectListItem形式に整形。
  5. ViewDataに格納してビューに渡す

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

用途

このコードは、例えばドロップダウンリスト(<select>タグ)にジャンル名を表示するために使用されます。ビュー側では、ViewData["GenreName"]を利用してドロップダウンリストを生成できます。

例:

<select>

    @foreach (var item in (IEnumerable<SelectListItem>)ViewData["GenreName"])

    {

        <option value="@item.Value">@item.Text</option>

    }

</select>

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

例:@Html.DropDownListForを使用したドロップダウンの生成


例:ViewのCreateページでのドロップダウン表示

<div class="form-group" style="padding-top:10px;padding-bottom:10px">

    <label asp-for="GenreName" class="control-label"></label>

   @*  //ドロップダウン表示 *@

    @Html.DropDownListFor(

             m => m.GenreName,

             (IEnumerable<SelectListItem>)ViewData["GenreName"],

             "名前を選択して下さい。",

             new { @class = "form-control" }

             )

    <span asp-validation-for="GenreName" class="text-danger"></span>

</div>

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

例:ViewのEdit(編集)ページでのドロップダウン表示

<div class="form-group">

    @*  <label asp-for="GenreName" class="control-label"></label> *@

    <h6>ジャンルのカテゴリ―名</h6>

    @Html.DropDownListFor(

             m => m.GenreName,

             (IEnumerable<SelectListItem>)ViewData["GenreName"],

             "名前を選択して下さい。",

             new { @class = "form-control" }

             )

   @*  <input asp-for="GenreName" class="form-control" /> *@

    <span asp-validation-for="GenreName" class="text-danger"></span>

</div>

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

これにより、CreateページとEditページに於いて、ジャンル名が選択可能なリストとして表示されます。


添付画像

画像はありません
Genreのカテゴリ-名
Views
編集 | 記事一覧