ShortName in the Display attribute (DataAnnotations)

asp.net-mvc, asp.net-mvc-4, c#, data-annotations, razor

Solution

If you look at the Description for the `ShortName` property on the `Display` Attribute you'll see that it has a pretty limited scope out of the box:

Of course, that doesn't limit you from leveraging that value on your Model Metadata, but there aren't any native helpers that do so.

Starting with MVC 2, `ModelMetadata` provides two methods to access the underlying data: `FromStringExpression` and `FromLambdaExpression`, so you don't really need to start from scratch in writing your own helper or extension method.

If you hate writing HTML helper methods, you can do this all inline:

@ModelMetadata.FromLambdaExpression<RegisterModel, string>( 
            model => model.TransferDate, ViewData).ShortDisplayName} )  

But it's also perfectly valid to add an extension method for consistency of access, deduplication of code, and improved error handling

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));
   }
}

And then use like any other helper method:

@Html.ShortNameFor(model => model.TransferDate)

Further Reading:

- How do I display the DisplayAttribute.Description attribute value?

- MVC has long subsisted on custom extension methods, like needing DisplayNameFor before it was added in MVC 4

- See this question for a quick breakdown of the differences between `[Display(name="")]` vs. `[DisplayName("")]` attributes

- See this answer for working with ASP.NET MVC 6 / Core 1

Problem

Name attribute works proper, but ShortName doesn't work. ``` [Display(Name = "Date of the transfer the task", ShortName = "Trans date")] public DateTime TransferDate { get; set; } ``` Even when I delete Name attribute, ShortName is ignored ("TransferDate" displays in the column header). In the view I do this: ``` @Html.DisplayNameFor(model => model.TransferDate) ```

Original source

Related problems