4

我看到DisplayAttribute有一个ShortName属性,但我没有看到Html.ShortName帮助。我怎样才能为我的表格列标题使用这个短名称?我必须编写自己的助手吗?

4

2 回答 2

10

您可以编写自己的助手:

就像是

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 中,此名称用于列不够宽以显示完整字段名称的表中。如果此字段为空,则应使用 DisplayName。

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

于 2013-01-10T10:39:26.197 回答
1

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

@model IEnumerable<Document>

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

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

我在这里找到了一个:

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() : "";
}

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

于 2017-02-16T00:08:19.713 回答