@Html.DisplayFor - DateFormat ("mm/dd/yyyy")
asp.netasp.net Mvcasp.net Problem Overview
I have the following razor code that I want to have mm/dd/yyyy
date format:
Audit Date: @Html.DisplayFor(Model => Model.AuditDate)
I have tried number of different approaches but none of that approaches works in my situation
my AuditDate is a DateTime?
type
I have tried something like this and got this error:
@Html.DisplayFor(Model => Model.AuditDate.Value.ToShortDateString())
Additional information: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
Tried this:
@Html.DisplayFor(Model => Model.AuditDate.ToString("mm/dd/yyyy"))
No overload for method 'ToString' takes 1 arguments
asp.net Solutions
Solution 1 - asp.net
If you use DisplayFor
, then you have to either define the format via the DisplayFormat
attribute or use a custom display template. (A full list of preset DisplayFormatString
's can be found here.)
[DisplayFormat(DataFormatString = "{0:d}")]
public DateTime? AuditDate { get; set; }
Or create the view Views\Shared\DisplayTemplates\DateTime.cshtml
:
@model DateTime?
@if (Model.HasValue)
{
@Model.Value.ToString("MM/dd/yyyy")
}
That will apply to all DateTime
s, though, even ones where you're encoding the time as well. If you want it to apply only to date-only properties, then use Views\Shared\DisplayTemplates\Date.cshtml
and the DataType
attribute on your property:
[DataType(DataType.Date)]
public DateTime? AuditDate { get; set; }
The final option is to not use DisplayFor
and instead render the property directly:
@if (Model.AuditDate.HasValue)
{
@Model.AuditDate.Value.ToString("MM/dd/yyyy")
}
Solution 2 - asp.net
If you are simply outputting the value of that model property, you don't need the DisplayFor
html helper, just call it directly with the proper string formatting.
Audit Date: @Model.AuditDate.Value.ToString("d")
Should output
Audit Date: 1/21/2015
Lastly, your audit date could be null, so you should do the conditional check before you attempt to format a nullable value.
@if (item.AuditDate!= null) { @Model.AuditDate.Value.ToString("d")}
Googling the error that you are getting provides this answer, which shows that the error is from using the word Model in your Html helpers. For instance, using @Html.DisplayFor(Model=>Model.someProperty)
. Change these to use something else other than Model
, for instance: @Html.DisplayFor(x=>x.someProperty)
or change the capital M
to a lowercase m
in these helpers.
Solution 3 - asp.net
I have been using this change in my code :
old code :
<td>
@Html.DisplayFor(modelItem => item.dataakt)
</td>
new :
<td>
@Convert.ToDateTime(item.dataakt).ToString("dd/MM/yyyy")
</td>
Solution 4 - asp.net
You can use the [DisplayFormat] attribute on your view model as you want to apply this format for the whole project.
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
public Nullable<System.DateTime> Date { get; set; }
Solution 5 - asp.net
@ChrisPratt's answer about the use of Display Template is wrong. The correct code to make it work is:
@model DateTime?
@if (Model.HasValue)
{
@Convert.ToDateTime(Model).ToString("MM/dd/yyyy")
}
That's because .ToString()
for Nullable<DateTime>
doesn't accept Format
parameter.
Solution 6 - asp.net
I implemented the similar thing this way:
- Use TextBoxFor to display date in required format and make the field readonly.
@Html.TextBoxFor(Model => Model.AuditDate, "{0:dd-MMM-yyyy}", new{@class="my-style", @readonly=true})
2. Give zero outline and zero border to TextBox in css.
.my-style {
outline: none;
border: none;
}
And......Its done :)
Solution 7 - asp.net
For me it was enough to use
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
public DateTime StartDate { set; get; }
Solution 8 - asp.net
In View Replace this:
@Html.DisplayFor(Model => Model.AuditDate.Value.ToShortDateString())
With:
@if(@Model.AuditDate.Value != null){@Model.AuditDate.Value.ToString("dd/MM/yyyy")}
else {@Html.DisplayFor(Model => Model.AuditDate)}
Explanation: If the AuditDate value is not null then it will format the date to dd/MM/yyyy, otherwise leave it as it is because it has no value.
Solution 9 - asp.net
You could use Convert
<td>@Convert.ToString(string.Format("{0:dd/MM/yyyy}", o.frm_dt))</td>
Solution 10 - asp.net
Maybe try simply
@(Model.AuditDate.HasValue ? Model.AuditDate.ToString("mm/dd/yyyy") : String.Empty)
also you can use many type of string format like .ToString("dd MMM, yyyy") .ToString("d") etc
Solution 11 - asp.net
After some digging and I ended up setting Thread
's CurrentCulture value to have CultureInfo("en-US") in the controller’s action method:
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
Here are some other options if you want have this setting on every view.
About CurrentCulture
property value:
> The CultureInfo object that is returned by this property, together > with its associated objects, determine the default format for dates, > times, numbers, currency values, the sorting order of text, casing > conventions, and string comparisons.
Source: MSDN CurrentCulture
Note: The previous CurrentCulture
property setting is probably optional if the controller is already running with CultureInfo("en-US")
or similar where the date format is "MM/dd/yyyy"
.
After setting the CurrentCulture
property, add code block to convert the date to "M/d/yyyy"
format in the view:
@{ //code block
var shortDateLocalFormat = "";
if (Model.AuditDate.HasValue) {
shortDateLocalFormat = ((DateTime)Model.AuditDate).ToString("M/d/yyyy");
//alternative way below
//shortDateLocalFormat = ((DateTime)Model.AuditDate).ToString("d");
}
}
@shortDateLocalFormat
Above the @shortDateLocalFormat
variable is formatted with ToString("M/d/yyyy")
works. If ToString("MM/dd/yyyy")
is used, like I did first then you end up having leading zero issue. Also like recommended by Tommy ToString("d")
works as well. Actually "d"
stands for “Short date pattern” and can be used with different culture/language formats too.
I guess the code block from above can also be substituted with some cool helper method or similar.
For example
@helper DateFormatter(object date)
{
var shortDateLocalFormat = "";
if (date != null) {
shortDateLocalFormat = ((DateTime)date).ToString("M/d/yyyy");
}
@shortDateLocalFormat
}
can be used with this helper call
@DateFormatter(Model.AuditDate)
Update, I found out that there’s alternative way of doing the same thing when DateTime.ToString(String, IFormatProvider) method is used. When this method is used then there’s no need to use Thread
’s CurrentCulture
property. The CultureInfo("en-US")
is passed as second argument --> IFormatProvider to DateTime.ToString(String, IFormatProvider)
method.
Modified helper method:
@helper DateFormatter(object date)
{
var shortDateLocalFormat = "";
if (date != null) {
shortDateLocalFormat = ((DateTime)date).ToString("d", new System.Globalization.CultureInfo("en-US"));
}
@shortDateLocalFormat
}
Solution 12 - asp.net
This is the best way to get a simple date string :
@DateTime.Parse(Html.DisplayFor(Model => Model.AuditDate).ToString()).ToShortDateString()
Solution 13 - asp.net
I had a similar issue on my controller and here is what worked for me:
model.DateSigned.HasValue ? model.DateSigned.Value.ToString("MM/dd/yyyy") : ""
"DateSigned" is the value from my model The line reads, if the model value has a value then format the value, otherwise show nothing.
Hope that helps
Solution 14 - asp.net
You can use this instead of using @html.DisplayFor()
.
@Convert.ToString(string.Format("{0:dd/MM/yyyy}", Model.AuditDate))
Solution 15 - asp.net
See this answer about the No overload for method 'ToString' takes 1 arguments
error.
You cannot format a nullable DateTime - you have to use the DateTime.Value property.
@Model.AuditDate.HasValue ? Model.AuditDate.Value.ToString("mm/dd/yyyy") : string.Empty
> Tip: It is always helpful to work this stuff out in a standard class with intellisense before putting it into a view. In this case, you would get a compile error which would be easy to spot in a class.