私が持っているモデルファイルで
public enum Title
{
Ms,
Mrs,
Mr
}
これらの選択可能な値を登録フォームのダウンダウン ボックスに表示したいと思います。
しかし、方法がわかりません。これらのタイトルが で使用されている可能性がある場合は、必ずしも列挙型を使用する必要はありませんdropdownlistfor
。方法を提案してください。ありがとうございました。
私が持っているモデルファイルで
public enum Title
{
Ms,
Mrs,
Mr
}
これらの選択可能な値を登録フォームのダウンダウン ボックスに表示したいと思います。
しかし、方法がわかりません。これらのタイトルが で使用されている可能性がある場合は、必ずしも列挙型を使用する必要はありませんdropdownlistfor
。方法を提案してください。ありがとうございました。
このようにバインドできます
ddl.DataSource = Enum.GetNames(typeof(Title));
ddl.DataBind();
選択した値も取得したい場合は、次のようにします
Title enumTitle = (Title)Enum.Parse(ddl.SelectedValue);
これにはいくつかの方法があります。
1 つは、選択リストを返すメソッドを作成することです。
private static SelectList ToSelectList(Type enumType, string selectedItem)
{
var items = new List<SelectListItem>();
foreach (var item in Enum.GetValues(enumType))
{
var title = ((Enum)item).GetDescription();
var listItem = new SelectListItem
{
Value = ((int)item).ToString(),
Text = title,
Selected = selectedItem == item.ToString()
};
items.Add(listItem);
}
return new SelectList(items, "Value", "Text");
}
2番目の方法は、ヘルパーメソッドを作成することです
public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression, string optionLabel, object htmlAttributes)
{
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
Type enumType = GetNonNullableModelType(metadata);
IEnumerable<TEnum> values = Enum.GetValues(enumType).Cast<TEnum>();
IEnumerable<SelectListItem> items = from value in values
select new SelectListItem
{
Text = GetEnumDescription(value),
Value = value.ToString(),
Selected = value.Equals(metadata.Model)
};
// If the enum is nullable, add an 'empty' item to the collection
if (metadata.IsNullableValueType)
{
items = SingleEmptyItem.Concat(items);
}
return htmlHelper.DropDownListFor(expression, items, optionLabel, htmlAttributes);
}
public static string GetEnumDescription<TEnum>(TEnum value)
{
FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
if ((attributes != null) && (attributes.Length > 0))
{
return attributes[0].Description;
}
return value.ToString();
}
ものを組み合わせて使っています。まず、列挙型からコレクション内のすべての列挙項目を取得する列挙型の拡張メソッドを次に示します。
public static class EnumUtil
{
public static IEnumerable<T> GetEnumValuesFor<T>()
{
return Enum.GetValues(typeof(T)).Cast<T>();
}
}
次に、リストをリストに変換するコードがいくつかあります。渡す値のどれが既に選択されているかを示すことができます (ドロップダウン リストの場合は 1 だけですが、これを使用して CheckBoxList を強化することもできます)。また、必要に応じて、除外する値を示すこともできます。
public static List<SelectListItem> GetEnumsByType<T>(bool useFriendlyName = false, List<T> exclude = null,
List<T> eachSelected = null, bool useIntValue = true) where T : struct, IConvertible
{
var enumList = from enumItem in EnumUtil.GetEnumValuesFor<T>()
where (exclude == null || !exclude.Contains(enumItem))
select enumItem;
var list = new List<SelectListItem>();
foreach (var item in enumList)
{
var selItem = new SelectListItem();
selItem.Text = (useFriendlyName) ? item.ToFriendlyString() : item.ToString();
selItem.Value = (useIntValue) ? item.To<int>().ToString() : item.ToString();
if (eachSelected != null && eachSelected.Contains(item))
selItem.Selected = true;
list.Add(selItem);
}
return list;
}
public static List<SelectListItem> GetEnumsByType<T>(T selected, bool useFriendlyName = false, List<T> exclude = null,
bool useIntValue = true) where T : struct, IConvertible
{
return GetEnumsByType<T>(
useFriendlyName: useFriendlyName,
exclude: exclude,
eachSelected: new List<T> { selected },
useIntValue: useIntValue
);
}
次に、View Model で、DropdownList を埋める必要がある場合、次のようにヘルパー メソッドから List を取得できます。
public class AddressModel
{
public enum OverrideCode
{
N,
Y,
}
public List<SelectListItem> OverrideCodeChoices { get {
return SelectListGenerator.GetEnumsByType<OverrideCode>();
} }
}