C# サンプル集 |
Visual Basic 中学校 > C# サンプル集 > C# サンプル集目次 > ASP.NET Core > Razor Pages
ドロップダウン形式の選択
2024/3/25
この記事は ASP.NET Core Razor Pages を対象にしています。
この記事内のサンプルは、プロジェクトテンプレート「ASP.NET Core Web アプリ」を使用して、PagesフォルダーにこのRazorページを追加する前提です。
普通のドロップダウンリスト
選択肢にない値を入力することはできません。
Select.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
namespace WorkStandard.Pages.controls
{
public class SelectModel : PageModel
{
[BindProperty]
public string? Food { get; set; }
public SelectList Options { get; set; } = new SelectList(new string[] { "Rice", "Noodle", "Onigiri" });
public void OnPost()
{
System.Diagnostics.Debug.WriteLine($"Food = {Food}");
}
}
}
Select.cshtml
@page
@model WorkStandard.Pages.controls.SelectModel
<form method="post">
<select class="form-select mb-3" asp-for="Food" asp-items="Model.Options"></select>
<input type="submit" />
</form>
主なCSSクラスの効果
メモ:selectのclassにform-select-lg クラスを追加すると大きめの表示になります。
選択肢をグループ化したドロップダウンリスト
SelectWithGroup.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
namespace WorkStandard.Pages.controls
{
public class SelectWithGroupModel : PageModel
{
[BindProperty]
public string? Animal { get; set; }
public List<SelectListItem> AnimalOptions { get; set; } = new();
public SelectWithGroupModel()
{
SelectListGroup group1 = new() { Name = "哺乳類" };
AnimalOptions.Add(new SelectListItem { Text = "イヌ", Group = group1 });
AnimalOptions.Add(new SelectListItem { Text = "サル", Group = group1 });
AnimalOptions.Add(new SelectListItem { Text = "ライオン", Group = group1 });
SelectListGroup group2 = new() { Name = "爬虫類" };
AnimalOptions.Add(new SelectListItem { Text = "ワニ", Group = group2 });
AnimalOptions.Add(new SelectListItem { Text = "トカゲ", Group = group2 });
SelectListGroup group3 = new() { Name = "両生類" };
AnimalOptions.Add(new SelectListItem { Text = "カエル", Group = group3 });
AnimalOptions.Add(new SelectListItem { Text = "イモリ", Group = group3 });
}
public void OnPost()
{
System.Diagnostics.Debug.WriteLine($"Animal = {Animal}");
}
}
}
SelectWithGroup.cshtml
@page
@model WorkStandard.Pages.controls.SelectWithGroupModel
<form method="post">
<select class="form-select mb-3" asp-for="Animal" asp-items="Model.AnimalOptions"></select>
<input type="submit" />
</form>
主なCSSクラスの効果
メモ:selectのclassにform-select-lg クラスを追加すると大きめの表示になります。
これでもできます。
SelectWithGroup.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
namespace WorkStandard.Pages.controls
{
public class SelectWithGroupModel : PageModel
{
[BindProperty]
public string? Animal { get; set; }
public SelectList AnimalOptions { get; set; }
public SelectWithGroupModel()
{
List<object> options = new();
options.Add(new { Group = "哺乳類", Text = "ネコ" });
options.Add(new { Group = "哺乳類", Text = "リカオン" });
options.Add(new { Group = "哺乳類", Text = "バク" });
options.Add(new { Group = "爬虫類", Text = "ヘビ" });
options.Add(new { Group = "爬虫類", Text = "カメ" });
options.Add(new { Group = "両生類", Text = "サンショウウオ" });
options.Add(new { Group = "両生類", Text = "サイレン" });
AnimalOptions = new SelectList(options, "Text", "Text", null, "Group");
}
public void OnPost()
{
System.Diagnostics.Debug.WriteLine($"Animal = {Animal}");
}
}
}
メモ:この例で匿名型 new {Group = ..., Text = ...}を使っている部分は、他の構造体やクラスでもよく、プロパティ名もGroupやTextに限定されませんので、何か別途構造体やクラスで一覧がある場合は、この例の方がやりやすいです。"Group" や "Text" の名前が異なる場合は、SelectListのコンストラクターで"Text" や "Group" を指定している箇所を変更します。
SelectWithGroup.cshtml は前の例と同じです。
選択肢以外も入力できるドロップダウン
Edge(バージョン119)での入力候補の外見
Chrome(バージョン119)での入力候補の外見。(このスクショには送信ボタンも入ってしまいました。)
DataList.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace WorkStandard.Pages.controls
{
public class DataListModel : PageModel
{
[BindProperty]
public string? Todofuken { get; set; }
public void OnPost()
{
System.Diagnostics.Debug.WriteLine($"入力されたのは{Todofuken}");
}
}
}
DataList.cshtml
@page
@model WorkStandard.Pages.controls.DataListModel
<form method="post">
<label asp-for="Todofuken" class="form-label">都道府県</label>
<input asp-for="Todofuken" list="TodofukenList" class="form-control" />
<datalist id="TodofukenList">
<option value="北海道"></option>
<option value="岩手県"></option>
<option value="宮城県"></option>
<option value="秋田県"></option>
<option value="山形県"></option>
</datalist>
<input type="submit" />
</form>
最初の選択肢を選択できなくする
- 「選択してください...」のまま送信するとエラーメッセージを表示します。
- 選択肢にない値を入力することはできません。
SelectAndLeadingTop.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace WorkStandard.Pages.controls
{
public class SelectAndLeadingTopModel : PageModel
{
[BindProperty]
[DisplayName("栄養素")]
[Required(ErrorMessage = "{0}を何か1つ選択してください。")]
public string? Nutrition { get; set; }
public SelectList Options { get; set; } = new (new string[] { "タンパク質", "脂質", "炭水化物" });
public void OnPost()
{
//サーバー側での入力検証の判定
if (!ModelState.IsValid)
{
//「選択してください...」が選択され、クライアント側のチェックが回避された場合は、
// ここが実行されます。(想定されるのは悪意のあるユーザーか特殊な環境です。)
return;
}
System.Diagnostics.Debug.WriteLine($"Nutrition = {Nutrition}");
}
}
}
SelectAndLeadingTop.cshtml
@page
@model WorkStandard.Pages.controls.SelectAndLeadingTopModel
<form method="post">
<div class="col-sm-4 mb-3">
<label asp-for="Nutrition"></label>
<select class="form-select" asp-for="Nutrition" asp-items="Model.Options">
<option selected disabled value="">選択してください...</option>
</select>
<span asp-validation-for="Nutrition" class="text-danger"></span>
</div>
<input type="submit" />
</form>
@section Scripts {
@{
//クライアント側での検証を有効にします。
await Html.RenderPartialAsync("_ValidationScriptsPartial");
}
}
主なCSSクラスの効果
- mb-3 下に少し余白(margin)を設けます。→ 余白
- col-sm-4 幅を行の4/12にします。ウィンドウ幅が576px(sm)より小さい場合は100%にします。→ グリッドシステム
- form-select inputをBootstrapの外観にします。→ セレクト
メモ:selectのclassにform-select-lg クラスを追加すると大きめの表示になります。