Display属性中的ShortName(DataAnnotations)

sil*_*bos 3 c# asp.net-mvc data-annotations razor asp.net-mvc-4

Name属性正常工作,但ShortName不起作用.

[Display(Name = "Date of the transfer the task", ShortName = "Trans date")]
public DateTime TransferDate { get; set; }
Run Code Online (Sandbox Code Playgroud)

即使我删除了Name属性,也会忽略ShortName(列标题中会显示"TransferDate").

在视图中我这样做:

@Html.DisplayNameFor(model => model.TransferDate)
Run Code Online (Sandbox Code Playgroud)

Kyl*_*Mit 7

如果您查看ShortName属性上的Display属性描述,您将看到它的开箱即用范围非常有限:

短名称描述

当然,这并不限制您在模型元数据上利用该值,但没有任何本地帮助程序可以这样做.

与MVC 2开始,ModelMetadata提供了两种方法来访问底层数据:FromStringExpressionFromLambdaExpression,所以你并不真的需要从头开始编写自己的助手或扩展方法开始.

如果您讨厌编写HTML帮助程序方法,则可以全部内联:

@ModelMetadata.FromLambdaExpression<RegisterModel, string>( 
            model => model.TransferDate, ViewData).ShortDisplayName} )  
Run Code Online (Sandbox Code Playgroud)

但是,为访问的一致性,代码的重复数据删除和改进的错误处理添加扩展方法也是完全有效的

public static class MvcHtmlHelpers
{
   public static MvcHtmlString ShortNameFor<TModel, TValue>(this HtmlHelper<TModel> self, 
           Expression<Func<TModel, TValue>> expression)
   {
       var metadata = ModelMetadata.FromLambdaExpression(expression, self.ViewData);
       var name = metadata.ShortDisplayName ?? metadata.DisplayName ?? metadata.PropertyName;

       return MvcHtmlString.Create(string.Format(@"<span>{0}</span>", name));
   }
}
Run Code Online (Sandbox Code Playgroud)

然后像任何其他帮助方法一样使用:

@Html.ShortNameFor(model => model.TransferDate)
Run Code Online (Sandbox Code Playgroud)

进一步阅读: