MVC 開發中常需將 enum 綁定至 DropDownList,手動轉換 SelectListItem 既繁瑣又易出錯。透過擴展方法封裝轉換邏輯,即可實現「一行程式碼」完成綁定。
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
public static class EnumExtensions
{
/// <summary>
/// 將 enum 轉為 SelectListItem 清單(值為數值,文字為名稱)
/// </summary>
public static List<SelectListItem> ToSelectListItem(this Enum valueEnum)
{
return Enum.GetValues(valueEnum.GetType())
.Cast<int>()
.Select(value => new SelectListItem
{
Text = Enum.GetName(valueEnum.GetType(), value),
Value = value.ToString()
})
.ToList();
}
/// <summary>指定預設選中項(以名稱比對)</summary>
public static List<SelectListItem> ToSelectListItem(this Enum valueEnum, string selectedName)
{
return Enum.GetValues(valueEnum.GetType())
.Cast<int>()
.Select(value => new SelectListItem
{
Text = Enum.GetName(valueEnum.GetType(), value),
Value = Enum.GetName(valueEnum.GetType(), value), // Value 使用名稱而非數值
Selected = Enum.GetName(valueEnum.GetType(), value) == selectedName
})
.ToList();
}
}
public ActionResult Create()
{
// 簡單綁定
TempData["PriorityList"] = ((Enum)TaskPriority.Normal).ToSelectListItem();
// 指定預設選中
TempData["StatusList"] = ((Enum)OrderStatus.Pending).ToSelectListItem("Pending");
return View();
}
@Html.DropDownList("Priority", (List<SelectListItem>)TempData["PriorityList"], "請選擇優先級", new { @class = "form-control" })
System.ComponentModel.DescriptionAttribute 讓顯示文字支援多語系或友善名稱。Html.GetEnumSelectList<TEnum>(),無需自行擴展。擴展方法將重複轉換邏輯集中化,減少 Controller 與 View 的樣板程式碼,提升開發效率與維護性。