記事詳細
- 投稿日
- 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
のコレクション)を格納。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
全体の流れ
- データベースからジャンル名を取得。
- 空文字列を除外し、アルファベット順に並べ替え。
- 重複を排除し、リストに変換。
- ビューで使用するために
SelectListItem
形式に整形。 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