1

このトピックにはいくつかのスレッドがあることを私は知っています。私は多くの解決策を見ていますが、それらのほとんどは列挙型がどのタイプであるかについての知識を必要とします。Enumはデフォルトで文字列のテンプレートを使用するため、正確なタイプを見つけるのはより困難です。

誰かがこれを解決する方法の完全な例を持っていますか?

編集。Roysの提案に基づいて、これが私のコードです。

HtmlHelpers.cs

public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) where TModel : class
{
    var type = htmlHelper.ViewData.ModelMetadata.ModelType;
    var inputName = type.Name;
    var value = htmlHelper.ViewData.Model == null ? default(TProperty) : expression.Compile()(htmlHelper.ViewData.Model);
    var selected = value == null ? String.Empty : value.ToString();
    return htmlHelper.DropDownList(inputName, ToSelectList(type, selected));
}

private static IEnumerable<SelectListItem> ToSelectList(Type enumType, string selectedItem)
{
    var items = new List<SelectListItem>();
    foreach (var item in Enum.GetValues(enumType))
    {
        var fi = enumType.GetField(item.ToString());
        var attribute = fi.GetCustomAttributes(typeof(DescriptionAttribute), true).FirstOrDefault();
        var title = attribute == null ? item.ToString() : ((DescriptionAttribute)attribute).Description;
        var listItem = new SelectListItem
        {
            Value = ((int)item).ToString(),
            Text = title,
            Selected = selectedItem == ((int)item).ToString()
        };
        items.Add(listItem);
    }

    return new SelectList(items, "Value", "Text");
}

ビューモデル

public class AddTestForm
{
    [UIHint("Enum")]
    public EnumType Type { get; set; }

    public string Description { get; set; }

public enum EnumType
{
    One = 1,
    Two = 2
}

EditorTemplates / Enum.cshtml

@model object

@Html.EnumDropDownListFor(x => x)

そしてビューで...

@Html.EditorForModel()

現在の問題は、フォームが投稿された後、列挙型を入力できないことです。

4

1 に答える 1

2

selectあなたのヘルパーは、生成された要素に間違った名前を生成します:

<select id="Type_EnumType" name="Type.EnumType">

DefaultModelBindername 属性を使用してプロパティ名を照合します。ヘルパーが生成した名前"Type.EnumType"がモデル プロパティ名と一致しません"Type"。Type 名の代わりに機能させるには、式からプロパティ名を取得する必要があります。ExpressionHelperクラスを使用すると、非常に簡単です。

public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) where TModel : class
{
    ...
    return htmlHelper.DropDownList(ExpressionHelper.GetExpressionText(expression), ToSelectList(type, selected));
}
于 2011-12-11T09:02:45.850 に答える