If I have in my model class a property of type DateTime how can I render it in a specific format – for example in the format which ToLongDateString() returns?
I have tried this…
@Html.DisplayFor(modelItem => item.MyDateTime.ToLongDateString())
…which throws an exception because the expression must point to a property or field. And this…
@{var val = item.MyDateTime.ToLongDateString();
Html.DisplayFor(modelItem => val);
}
…which doesn’t throw an exception, but the rendered output is empty (although val contains the expected value, as I could see in the debugger).
Thanks for tips in advance!
Edit
ToLongDateString is only an example. What I actually want to use instead of ToLongDateString is a custom extension method of DateTime and DateTime?:
public static string FormatDateTimeHideMidNight(this DateTime dateTime)
{
if (dateTime.TimeOfDay == TimeSpan.Zero)
return dateTime.ToString("d");
else
return dateTime.ToString("g");
}
public static string FormatDateTimeHideMidNight(this DateTime? dateTime)
{
if (dateTime.HasValue)
return dateTime.Value.FormatDateTimeHideMidNight();
else
return "";
}
So, I think I cannot use the DisplayFormat attribute and DataFormatString parameter on the ViewModel properties.
If all you want to do is display the date with a specific format, just call:
Using
@Html.DisplayFor(...)is just extra work unless you are specifying a template, or need to use something that is built on templates, like iterating anIEnumerable<T>. Creating a template is simple enough, and can provide a lot of flexibility too. Create a folder in your views folder for the current controller (or shared views folder) calledDisplayTemplates. Inside that folder, add a partial view with the model type you want to build the template for. In this case I added/Views/Shared/DisplayTemplatesand added a partial view calledShortDateTime.cshtml.And now you can call that template with the following line: