首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

MVC 4 實用技巧:擴展方法將列舉型別自動轉為 DropDownList

     編輯:ASP.NET 基礎

痛點與解決方案

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" })

進階建議

  • 加上 Description 屬性支援:搭配 System.ComponentModel.DescriptionAttribute 讓顯示文字支援多語系或友善名稱。
  • 回傳 IEnumerable<SelectListItem>:介面導向設計,提高彈性。
  • ASP.NET Core 內建支援:新版可直接使用 Html.GetEnumSelectList<TEnum>(),無需自行擴展。

小結

擴展方法將重複轉換邏輯集中化,減少 Controller 與 View 的樣板程式碼,提升開發效率與維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved