モデルの列挙型をドロップダウンリストにバインドする方法を探しています。この投稿を見つけて、2番目の回答のコードを使用しましたが、ドロップダウンリストの作成に最適です。ただし、フォームを送信すると、常に列挙の最初の値でモデルが返されます。
列挙(これは私のモデルに含まれています):
public LayoutType Layout;
public enum LayoutType
{
Undefined = 0,
OneColumn = 1,
TwoColumn = 2,
ThreeColumn = 3
}
HTML ヘルパー メソッド:
private static Type GetNonNullableModelType(ModelMetadata modelMetadata)
{
Type realModelType = modelMetadata.ModelType;
Type underlyingType = Nullable.GetUnderlyingType(realModelType);
if (underlyingType != null)
{
realModelType = underlyingType;
}
return realModelType;
}
private static readonly SelectListItem[] SingleEmptyItem = new[] { new SelectListItem { Text = "", Value = "" } };
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;
else
return value.ToString();
}
public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression)
{
return EnumDropDownListFor(htmlHelper, expression, null);
}
public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression, 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, htmlAttributes);
}
意見:
@Html.EnumDropDownListFor(model => model.Layout)
ビューをレンダリングすると、ドロップダウンリストは期待どおりに完全に入力され、正しい値が選択されます。しかし、POST を送信して値をコントローラーに戻すと、Model.Layout の値は常に「未定義」になります。どんな助けでも大歓迎です!ありがとう、