web-dev-qa-db-fra.com

ASP.Net MVC DisplayFormat

Dans mon modèle, j'ai les DataAnnotations suivantes sur l'une de mes propriétés

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

L'annotation requise fonctionne très bien, j'ai ajouté les 2 autres pour essayer de supprimer l'heure. Il est lié à une entrée de la vue à l'aide de

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

Cependant, chaque fois que la vue se charge, je reçois toujours l'heure qui apparaît dans la zone de saisie. Est-il possible de supprimer cela à l'aide de DataAnnotations?

47
Gavin

L'attribut [DisplayFormat] n'est utilisé que dans EditorFor/DisplayFor, et non par les API HTML brutes comme TextBoxFor.

88
Brad Wilson

Comme Brad l'a dit, cela ne fonctionne pas pour TextBoxFor, mais vous devez également vous rappeler d'ajouter le ApplyFormatInEditMode si vous voulez qu'il fonctionne pour EditorFor.

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

Ensuite, utilisez

@Html.EditorFor(model => model.DateCreated)
28
Paul Johnson

Mon problème était de définir certains attributs html (jquery-datepicker), donc EditorFor n'était pas une option pour moi.

L'implémentation d'une méthode d'assistance personnalisée a résolu mon problème:

ModelClass avec DateTime-Property:

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

Afficher avec ModelClass comme modèle:

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

Helper-Methode dans la classe d'assistance statique:

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