我看到DisplayAttribute
有ShortName
属性,但我看不到Html.ShortName
帮助器。如何在表格列标题中使用此短名称?我必须写自己的帮手吗?
答案 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() : "";
}
不确定这是否是最佳方法,但对我来说效果很好。