| 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 クラスを追加すると大きめの表示になります。