如何为表格标题>使用Display属性的Short Name属性?

时间:2013-01-10 10:15:43

标签: asp.net-mvc asp.net-mvc-4

我看到DisplayAttributeShortName属性,但我看不到Html.ShortName帮助器。如何在表格列标题中使用此短名称?我必须写自己的帮手吗?

2 个答案:

答案 0 :(得分:8)

你可以写自己的帮手:

这样的东西
public static IHtmlString ShortLabelFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression) {
   var metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
   var content = metadata.ShortDisplayName?? metadata.DisplayName ?? /*something else*/ ?? string.Empty;
   return new HtmlString(content);
}

但是,来自msdn

  

短显示名称可用于工具提示或其他显示   上下文如表格列表视图的标题完整   显示名称可能不适合。例如,在MVC中,使用此名称   列不足以显示完整列的表   字段名称。如果此字段为null,则应使用DisplayName。

所以它看起来应该是自动的(当没有足够的空间时),但是......在这里未经测试。听起来它应该以这种方式与@ Html.LabelFor一起使用。

答案 1 :(得分:1)

对我而言,接受的答案没有多大帮助,因为我的视图模型被定义为IEnumerable:

@model IEnumerable<Document>

所以我需要现有扩展方法的DisplayShortNameFor版本:

public static MvcHtmlString DisplayNameFor<TModel, TValue>(this HtmlHelper<IEnumerable<TModel>> html, Expression<Func<TModel, TValue>> expression);

我能够在here中找到一个:

public static string DisplayShortNameFor<TModel, TValue>(this global::System.Web.Mvc.HtmlHelper<global::System.Collections.Generic.IEnumerable<TModel>> t, global::System.Linq.Expressions.Expression<global::System.Func<TModel,TValue>> exp)
{
    CustomAttributeNamedArgument? DisplayName = null;
    var prop = exp.Body as MemberExpression;
    if (prop != null)
    {
        var DisplayAttrib = (from c in prop.Member.GetCustomAttributesData()
                             where c.AttributeType == typeof(DisplayAttribute)
                             select c).FirstOrDefault();
        if(DisplayAttrib != null)
            DisplayName = DisplayAttrib.NamedArguments.Where(d => d.MemberName == "ShortName").FirstOrDefault();
    }
    return DisplayName.HasValue ? DisplayName.Value.TypedValue.Value.ToString() : "";
}

不确定这是否是最佳方法,但对我来说效果很好。