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>我正在循环的模型,并且每个枚举成员foo都有一个带有s 的枚举。DisplayAttribute大多数(但不是全部)DisplayAttribute属性都提供了一个Description属性,我想在我的循环中公开它,如下所示:

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

...这将显示每个foo对象的枚举值描述。

我很快发现它与模型助手不太相似。有人可以为此指出正确的方向吗?

4

2 回答 2

0

您可以使用 for 循环而不是 foreach 并使用您的助手获取描述

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

您还可以创建新的辅助方法,该方法将为指定模型创建新的 viewdatadictionary 并获取属性的元数据(我没有检查它,但它应该可以工作:))

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 回答
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 回答