はい、ASP.NET Core MVC で ドロップダウン <select> と 自由入力 <input> を併用する方法はあります。
一般的には以下のようなパターンで実装します。
1. 基本的な考え方
- ドロップダウン:既存の選択肢から選べるようにする(
<select> + asp-items)。 - 自由入力:選択肢にない場合にユーザーが直接入力できるようにする(
<input type="text">)。 - サーバー側では、どちらが入力されたかを判定して保存します。
2. 実装例
モデル
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc.Rendering;
public class MyFormViewModel
{
public string SelectedOption { get; set; } // ドロップダウン選択値
public string CustomInput { get; set; } // 自由入力値
public List<SelectListItem> Options { get; set; } // 選択肢リスト
}
コントローラ
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using System.Collections.Generic;
public class MyFormController : Controller
{
[HttpGet]
public IActionResult Index()
{
var model = new MyFormViewModel
{
Options = new List<SelectListItem>
{
new SelectListItem { Value = "A", Text = "選択肢A" },
new SelectListItem { Value = "B", Text = "選択肢B" },
new SelectListItem { Value = "C", Text = "選択肢C" }
}
};
return View(model);
}
[HttpPost]
public IActionResult Index(MyFormViewModel model)
{
string finalValue = !string.IsNullOrWhiteSpace(model.CustomInput)
? model.CustomInput
: model.SelectedOption;
// ここで finalValue をDB保存や処理に利用
ViewBag.Message = $"入力された値: {finalValue}";
// 再表示用に選択肢を再設定
model.Options = new List<SelectListItem>
{
new SelectListItem { Value = "A", Text = "選択肢A" },
new SelectListItem { Value = "B", Text = "選択肢B" },
new SelectListItem { Value = "C", Text = "選択肢C" }
};
return View(model);
}
}
ビュー (Index.cshtml)
@model MyFormViewModel
<form asp-action="Index" method="post">
<div>
<label>ドロップダウンから選択:</label>
<select asp-for="SelectedOption" asp-items="Model.Options" class="form-control">
<option value="">-- 選択してください --</option>
</select>
</div>
<div style="margin-top:10px;">
<label>または自由入力:</label>
<input asp-for="CustomInput" class="form-control" placeholder="自由入力" />
</div>
<button type="submit" class="btn btn-primary" style="margin-top:10px;">送信</button>
</form>
@if (ViewBag.Message != null)
{
<div class="alert alert-info" style="margin-top:10px;">
@ViewBag.Message
</div>
}
3. 動作仕様
- ユーザーが ドロップダウンを選択 →
SelectedOption に値が入る。 - ユーザーが 自由入力を入力 →
CustomInput に値が入る。 - サーバー側で
CustomInput が空でなければそれを優先、空なら SelectedOption を使用。
4. 応用
- JavaScript を使って「自由入力が入力されたらドロップダウンを無効化」や「ドロップダウン選択時に自由入力をクリア」などの UX 改善も可能。
- 選択肢に「その他」を追加し、それが選ばれたら
<input> を表示する方法もよく使われます。
もし希望があれば、次のステップとして 「その他」選択時だけ <input> を表示する動的表示版 のコードも作れますが、
このままでも 選択と入力の併用フォームとして動作します。
この後、JavaScript を使って 「その他」選択時だけ入力欄を表示するバージョン を作成しましょうか?
そうすると UX がさらに良くなります。
Powered by Froala Editor