asp.net-mvc Webページがあり、列挙型に基づくドロップダウンリストを表示したいと思います。各列挙型アイテムのテキストと、列挙型が関連付けられているint値であるIDを表示したいと思います。この変換を行うためのエレガントな方法はありますか?
8 に答える
LINQを使用できます。
Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Select(v => new SelectListItem {
Text = v.ToString(),
Value = ((int)v).ToString()
}).ToList();
MVC 5.1以降、ビューにオプションを入力する必要がある場合、最も洗練された方法は、HtmlヘルパーのEnumDropDownListForメソッドを使用することです。select
@Html.EnumDropDownListFor(m => m.MyEnumProperty,new { @class="form-control"})
またはコントローラーのEnumHelperのGetSelectListメソッド:
var enumList = EnumHelper.GetSelectList(typeof (MyEnum));
これは、再利用できる静的な方法を使用して行いました。
public static IEnumerable<SelectListItem> EnumToSelectList<T>()
{
return (Enum.GetValues(typeof(T)).Cast<T>().Select(
e => new SelectListItem() { Text = e.ToString(), Value = e.ToString() })).ToList();
}
GetEnumSelectList
HtmlHelperクラスから使用しました
<select asp-for="MyProperty" class="form-control" asp-items="@Html.GetEnumSelectList<MyEnum>()" ></select>
今私は使用Tuple<string, string>
しましたが、これを変換して何でも使用できます:
var values = Enum.GetValues(typeof(DayOfWeek))
.Cast<DayOfWeek>()
.Select(d => Tuple.Create(((int)d).ToString(), d.ToString()))
.ToList()
Enum.GetNames()
列挙型アイテムの名前を含む文字列配列を取得するために使用できます。アイテム名がユーザーフレンドリーな場合は、おそらくこれで十分です。GetName()
それ以外の場合は、各アイテムに適切な名前を返す独自のメソッドを作成できます。
または-列挙型が変更されない(またはほとんど変更されない)場合は、ハードコードされたアイテムをドロップダウンに直接追加するメソッドを作成できます。これはおそらくより効率的です(それがあなたにとって重要な場合)。
私の拡張メソッドを使えばとても簡単です。これにより、プレースホルダーの追加、特定の値またはグループのグループ化と無効化などのオプションを提供することもできます。試してみる。
enum Color
{
Blue,
[Category("Light")]
[DisplayName("Light Blue")]
LBlue,
[Category("Dark")]
[DisplayName("Dark Blue")]
DBlue,
Red,
[Category("Dark")]
[DisplayName("Dark Red")]
DRed,
[Category("Light")]
[DisplayName("Light Red")]
LRed,
Green,
[Category("Dark")]
[DisplayName("Dark Green")]
DGreen,
[Category("Light")]
[DisplayName("Light Green")]
LGreen
}
var list = typeof(Color).ToSelectList();
//or with custom options
var list = typeof(Color).ToSelectList(new SelectListOptions { Placeholder = "Please Select A Color"});
Asp.Net Coreでは、次を使用するだけです。
<select asp-for="MyEnum" asp-items="Html.GetEnumSelectList(typeof(MyEnum))"></select>
または
ヘルパーを作成する
public static class EnumHelper
{
public static IEnumerable<SelectListItem> GetEnumSelectList<TEnum>(bool isNullable = false)
where TEnum : struct
{
IList<SelectListItem> selectLists = Enum.GetValues(typeof(TEnum)).Cast<TEnum>().Select(c => new SelectListItem()
{
Text = GetDisplayName(c),
Value = c.ToString()
}).ToList();
if (isNullable)
{
selectLists.Add(new SelectListItem());
}
return selectLists.OrderBy(c => c.Value);
}
public static string GetDisplayName<TEnum>(TEnum enumVal)
{
DisplayAttribute attr = GetAttribute<DisplayAttribute>(enumVal);
if (attr != null)
{
return attr.Name;
}
return enumVal?.ToString() ?? string.Empty;
}
public static TEnum GetAttribute<TEnum>(object enumVal) where TEnum : Attribute
{
if (enumVal == null)
{
return default;
}
Type type = enumVal.GetType();
MemberInfo[] memInfo = type.GetMember(enumVal.ToString());
if (memInfo.Length == 0)
{
return null;
}
object[] attributes = memInfo[0].GetCustomAttributes(typeof(TEnum), false);
return attributes.Length > 0 ? (TEnum)attributes[0] : null;
}
}
使用するには
@using MyClass.Helpers;
<select asp-for="MyEnum" asp-items="EnumHelper.GetEnumSelectList<MyEnum>(true)">/select>