我看到DisplayAttribute
有一个ShortName
属性,但我没有看到Html.ShortName
帮助。我怎样才能为我的表格列标题使用这个短名称?我必须编写自己的助手吗?
问问题
3218 次
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 回答