Gavin
Gavin

Reputation: 17382

ASP.Net MVC DisplayFormat

In my model I have the following DataAnnotations on one of my properties

[Required(ErrorMessage = "*")]
[DisplayFormat(DataFormatString = "{0:d}")]
[DataType(DataType.Date)]
public DateTime Birthdate { get; set; }

The required annotation works great, I added the other 2 to try and remove the time. It gets bound to an input in the view using

<%=Html.TextBoxFor(m => m.Birthdate, new { @class = "middle-input" })%>

However whenever the view loads I still get the time appearing in the input box. Is there anyway to remove this using DataAnnotations?

Upvotes: 49

Views: 107180

Answers (3)

Tobias
Tobias

Reputation: 2985

My problem was to set some html attributes (jquery-datepicker), so EditorFor was no option for me.

Implementing a custom helper-methode solved my problem:

ModelClass with DateTime-Property:

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd.MM.yyyy}", ApplyFormatInEditMode = true)]
public DateTime CustomDate{ get; set; }

View with ModelClass as Model:

@Html.TextBoxWithFormatFor(m => m.CustomDate, new Dictionary<string, object> { { "class", "datepicker" } })

Helper-Methode in static helper class:

public static class HtmlHelperExtension {
    public static MvcHtmlString TextBoxWithFormatFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes) {
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        return htmlHelper.TextBox(htmlHelper.ViewData.TemplateInfo.GetFullHtmlFieldName(metadata.PropertyName), string.Format(metadata.DisplayFormatString, metadata.Model), htmlAttributes);
    }
}

Upvotes: 8

Paul Johnson
Paul Johnson

Reputation: 1418

As Brad said it dosn't work for TextBoxFor but you'll also need to remember to add the ApplyFormatInEditMode if you want it to work for EditorFor.

[DataType(DataType.Date), DisplayFormat( DataFormatString="{0:dd/MM/yy}", ApplyFormatInEditMode=true )]
public System.DateTime DateCreated { get; set; }

Then use

@Html.EditorFor(model => model.DateCreated)

Upvotes: 29

Brad Wilson
Brad Wilson

Reputation: 70586

The [DisplayFormat] attribute is only used in EditorFor/DisplayFor, and not by the raw HTML APIs like TextBoxFor.

Upvotes: 91

Related Questions