文章目錄
Enum To List<SelectListItem> 及 Enum To SelectList
無意間看到專案中的一段程式碼,讓我停頓了一下,一時之間好幾個念頭閃過卻不知道該選擇哪個做法來改善
大意是 View 中有個欄位資料型別是一個 enum,預設範本直接透過 @Html.EnumDropDownListFor
進行綁定,但這樣的輸出有個缺點: enum 的預設值也會被輸出
,為了避免預設值也被輸出成選項,第一個念頭就是透過自行組裝 select 及 option 相關 html 的做法
只是靜心想想,是不是有其他更好的做法,想到三個做法筆記一下
前提說明
enum
public enum StatusEnum { Default = 0, Active, Verified, Closed, Stop }
使用
@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" })
希望做到可以過濾掉指定選項(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>
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() };
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() });
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");
心得
Enum to SelectList
其實與 LINQ - Method syntax
本質相同,只是將過濾後的資料轉為 SelectList 而已,LINQ - Query syntax
也可以比照辦理轉為 SelectList
需求很明確、程式很淺顯,但卻讓我想到不少:如果要快,第一個念頭就會使用 html 開工了,既直覺又不用擔心其他地方被影響,不過一昧求快是很難更上一層樓的,應該要對所有程式碼抱著持續調校優化的企圖心,督促自己思考才不會被淘汰
參考資訊
文章作者 Yowko Tsai
上次更新 2021-11-03
授權合約
本部落格 (Yowko's Notes) 所有的文章內容(包含圖片),任何轉載行為,必須通知並獲本部落格作者 (Yowko Tsai) 的同意始得轉載,且轉載皆須註明出處與作者。
Yowko's Notes 由 Yowko Tsai 製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款 釋出。