0

テンプレートエディタを作成しています。

@model dynamic


@{
    var modelMetadata = Html.GetModelMetadataFor(model => model);
    var selectList = ReflectionHelpers.GetSelectListByEnumFor(modelMetadata);
    String name = //get property name;
}

get modelMetadata で大丈夫

しかし、私が理解していない属性を取得する方法。

このコードを使用する前に:

Type enumType = GetNonNullableModelType(metadata);
IEnumerable<TEnum> values = Enum.GetValues(enumType).Cast<TEnum>();

IEnumerable<SelectListItem> items = values.Select(value =>
    new SelectListItem
    {
        Text = GetEnumDescription(value),
        Value = value.ToString(),
        Selected = value.Equals(metadata.Model)
    });

しかし、今回はTEnumの取得方法がわかりません

私の質問は、「列挙型から選択リストを作成する方法」です。

4

2 に答える 2

1

現在のモデルのドロップダウン リストを生成するカスタム html ヘルパーを作成できます (このモデルはもちろん列挙型であると仮定します)。

public static class HtmlExtensions
{
    public static IHtmlString DropDownListForEnum(this HtmlHelper htmlHelper)
    {
        var model = htmlHelper.ViewData.Model;
        if (model == null)
        {
            throw new ArgumentException("You must have a model in order to use this method");
        }
        var enumType = model.GetType();
        if (!enumType.IsEnum)
        {
            throw new ArgumentException("This method works only with enum types.");
        }

        var fields = enumType.GetFields(
            BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public
        );
        var values = Enum.GetValues(enumType).OfType<object>();
        var items =
            from value in values
            from field in fields
            let descriptionAttribute = field
                .GetCustomAttributes(
                    typeof(DescriptionAttribute), true
                )
                .OfType<DescriptionAttribute>()
                .FirstOrDefault()
            let description = (descriptionAttribute != null)
                ? descriptionAttribute.Description
                : value.ToString()
            where value.ToString() == field.Name
            select new { Id = value, Name = description };

        var selectList = new SelectList(items, "Id", "Name", model);
        return htmlHelper.DropDownList("", selectList);
    }
}

次に、テンプレートでこのヘルパーを呼び出すだけです。

@Html.DropDownListForEnum()

アップデート:

また、テンプレートにすべてのコードを含めたい場合は、次のようにすることもできます。

@using System.ComponentModel
@using System.Reflection
@using System.Linq;
@model object

@{
    var model = Html.ViewData.Model;
    if (model == null)
    {
        throw new ArgumentException("You must have a model in order to use this template");
    }
    var enumType = model.GetType();
    if (!enumType.IsEnum)
    {
        throw new ArgumentException("This method works only with enum types.");
    }

    var fields = enumType.GetFields(
        BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public
    );
    var values = Enum.GetValues(enumType).OfType<object>();
    var items =
        from value in values
        from field in fields
        let descriptionAttribute = field
            .GetCustomAttributes(
                typeof(DescriptionAttribute), true
            )
            .OfType<DescriptionAttribute>()
            .FirstOrDefault()
        let description = (descriptionAttribute != null)
            ? descriptionAttribute.Description
            : value.ToString()
        where value.ToString() == field.Name
        select new { Id = value, Name = description };

    var selectList = new SelectList(items, "Id", "Name", model);
}

@Html.DropDownList("", selectList)
于 2013-03-13T12:12:03.830 に答える
0

残念ながら、asp.net の仕組みはわかりませんが、.Net フレームワーク内では次の拡張メソッドを使用します。

public static IList<KeyValuePair<T, string>> ToList<T>() where T : struct
{
    var type = typeof(T);

    if (!type.IsEnum)
    {
        throw new ArgumentException("T must be an enum");
    }

    return (IList<KeyValuePair<T, string>>)
            Enum.GetValues(type)
                .OfType<T>()
                .Select(e =>
                {
                    var asEnum = (Enum)Convert.ChangeType(e, typeof(Enum));
                    return new KeyValuePair<T, string>(e, GetEnumDescription(asEnum));
                })
                .ToArray();
}

winforms 内では、次のように呼び出すだけで、コンボ ボックスに使用できます。

var pairs = EnumExtension.ToList<ContenAlignment>();
comboBoxFormat.DataSource = pairs;
comboBoxFormat.ValueMember = "Key";
comboBoxFormat.DisplayMember = "Value";

おそらく、上記のコンボ ボックス コードを asp.net 内で必要に応じて変更できます。

于 2013-03-13T12:25:13.107 に答える