0

次のようなモデルベースのDescriptionForヘルパーがあります。

public static HtmlString DescriptionFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper,
    Expression<Func<TModel, TProperty>> expression) where TModel : class
{
    var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
    return new HtmlString(metaData.Description.ToStringOrEmpty());
}

これはDataAnnotations.DisplayAttribute(具体的にはDescriptionパラメータ)をキーオフし、スムーズに動作します。

現在、モデルIEnumerable<foo>にループしている があり、列挙型メンバーごとに s を持つfoo列挙型がある場合があります。DisplayAttributeすべてではありませんが、ほとんどのDisplayAttribute属性がDescriptionプロパティを提供しており、次のようにループで公開したいと考えています。

@foreach(var fooObject in Model.foos){ 
    @Html.Description(fooObject, x=>x.fooEnumVal)
}

...ここに、各fooオブジェクトの列挙値の説明が表示されます。

モデル ヘルパーとあまり似ていないことがすぐにわかりました。誰かがこれについて正しい方向に私を向けることができますか?

4

2 に答える 2

0

私は最終的に次のようなことをしました:

public static HtmlString DescriptionFor(this Enum theEnum)
{
    var theEnumType = theEnum.GetType();

    //the enum must inherit from Enum, but not actually *be* Enum.
    if (!(theEnum is Enum) || theEnumType.Equals(typeof(Enum))) throw new ArgumentException("Not a valid Enumeration.");

    var fi = theEnumType.GetField(theEnum.ToString());
    var displayAttribute = ((DisplayAttribute[])fi.GetCustomAttributes(typeof(DisplayAttribute), false))
        .FirstOrDefault();

    if (displayAttribute == null) return new HtmlString(theEnum.ToString());

    return new HtmlString(displayAttribute.Description ?? theEnum.ToString());
}

これは最善の方法ではないと確信していますが、私の見解では効果的に書くことができました:

@fooObject.enumVal.DescriptionFor()

私が望むように機能しました。

于 2012-09-23T22:15:59.340 に答える
0

foreach の代わりに for ループを使用して、ヘルパーで説明を取得できます

@for(int i =0; i < Model.foos.Count(); i++){ 
    @Html.Description(x => x.foos[i].fooEnumVal)
}

また、指定されたモデルの新しいビューデータディクショナリを作成し、プロパティのメタデータを取得する新しいヘルパー メソッドを作成することもできます (チェックしていませんが、動作するはずです:))。

public static HtmlString DescriptionFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, TModel model, Expression<Func<TModel, TProperty>> expression) 
            where TModel : class
        {
            var metaData = ModelMetadata.FromLambdaExpression(expression, new ViewDataDictionary<TModel>(model));
            return new HtmlString(metaData.Description.ToStringOrEmpty());
        }

それが役に立てば幸い

于 2012-09-23T20:38:49.110 に答える