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) ```