Enum To List<SelectListItem> 及 Enum To SelectList

無意間看到專案中的一段程式碼,讓我停頓了一下,一時之間好幾個念頭閃過卻不知道該選擇哪個做法來改善

大意是 View 中有個欄位資料型別是一個 enum,預設範本直接透過 @Html.EnumDropDownListFor 進行綁定,但這樣的輸出有個缺點: enum 的預設值也會被輸出,為了避免預設值也被輸出成選項,第一個念頭就是透過自行組裝 select 及 option 相關 html 的做法

只是靜心想想,是不是有其他更好的做法,想到三個做法筆記一下

前提說明

  1. enum

    public enum StatusEnum
    {
        Default = 0,
        Active,
        Verified,
        Closed,
        Stop
    }
    
  2. 使用 @Html.EnumDropDownListFor

    @Html.LabelFor(model => model.Status, htmlAttributes: new { @class = "control-label col-md-2" })
    @Html.EnumDropDownListFor(model => model.Status, htmlAttributes: new { @class = "form-control" })
    
  3. 希望做到可以過濾掉指定選項(Default)

自行組裝 html

@Html.LabelFor(model => model.Status, htmlAttributes: new { @class = "control-label col-md-2" })
<select name="Status">
    @foreach (StatusEnum enumItem in Enum.GetValues(typeof(StatusEnum)))
    {
        //僅在 model 本身為 default 時才會出現 default 選項
        if (enumItem != StatusEnum.Default || Model.Status == StatusEnum.Default)
        {
            <option @((enumItem == Model.Status) ? "selected='selected'" : String.Empty) value="@enumItem">@enumItem.ToString()</option>
        }                        
    }
</select>

調整 DropDownList 的資料源

  • Enum To List<SelectListItem>

    1. LINQ - Query syntax

      from StatusEnum status in Enum.GetValues(typeof(StatusEnum))
      where status != StatusEnum.Default
      select new SelectListItem
      {
          Text = status.ToString(),
          Value = ((int)status).ToString()
      };
      

      2querysyntax

    2. LINQ - Method syntax

      Enum.GetValues(typeof(StatusEnum)).Cast<StatusEnum>()
      .Where(se => se != StatusEnum.Default).Select(se => new SelectListItem
      {
      Text = se.ToString(),
      Value = ((int)se).ToString()
      });
      

      1methodsyntax

  • Enum To SelectList

    var status = Enum.GetValues(typeof(StatusEnum)).Cast<StatusEnum>()
    .Where(se => se != StatusEnum.Default).Select(se => new 
    {
        value = (int)se, text = se.ToString()
    });;
    var result= new SelectList(status, "value", "text");
    

    3selectlist

心得

Enum to SelectList 其實與 LINQ - Method syntax 本質相同,只是將過濾後的資料轉為 SelectList 而已,LINQ - Query syntax 也可以比照辦理轉為 SelectList

需求很明確、程式很淺顯,但卻讓我想到不少:如果要快,第一個念頭就會使用 html 開工了,既直覺又不用擔心其他地方被影響,不過一昧求快是很難更上一層樓的,應該要對所有程式碼抱著持續調校優化的企圖心,督促自己思考才不會被淘汰

參考資訊

  1. How can I convert an enumeration into a List<selectlistitem>?</selectlistitem>
  2. How to get the values of an enum into a SelectList
  3. 有 EnumDropDownListFor 為什麼還要客製 Enum to Dropdownlist ?!
  4. Can you loop through all enum values?
  5. Query Syntax and Method Syntax in LINQ (C#)