286 votes

Date uniquement à partir de TextBoxFor()

J'ai du mal à afficher la seule partie date d'un DateTime dans une zone de texte en utilisant TextBoxFor<,>(expression, htmlAttributes).

Le modèle est basé sur Linq2SQL, le champ est un DateTime sur SQL et dans le modèle Entity.

Échec :

<%= Html.TextBoxFor(model => model.dtArrivalDate, String.Format("{0:dd/MM/yyyy}", Model.dtArrivalDate))%>

Cette astuce semble être dépréciée, toute valeur de chaîne dans l'objet htmlAttribute est ignorée.

Échec :

[DisplayFormat( DataFormatString = "{0:dd/MM/yyyy}" )]
public string dtArrivalDate { get; set; }

Je voudrais stocker et afficher uniquement la partie date dans la vue détaillée/modifiée, sans la partie "00:00:00".

381voto

Ross McNab Points 2995

MVC4 a résolu ce problème en ajoutant une nouvelle TextBoxFor qui prend un paramètre de format de chaîne. Vous pouvez maintenant simplement faire ceci :

@Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}")

Il existe également une surcharge qui prend les attributs html, ce qui vous permet de définir la classe CSS, d'installer des sélecteurs de date, etc :

@Html.TextBoxFor(m => m.EndDate, "{0:d MMM yyyy}", new { @class="input-large" })

40 votes

C'est la meilleure réponse pour MVC4 - elle me permet d'utiliser jquery UI datepicker et de formater la sélection de cette manière : @Html.TextBoxFor(m => m.SomeDate, "{0:MM/dd/yyyy}", new { @id="datepicker" })

3 votes

Merci ! Mais il semble que ce soit un bug que TextBoxFor ignore le modèle [DisplayFormat] attribut. Je suis content qu'il y ait au moins une dérogation dans TextBoxFor (et que vous m'ayez alerté à ce sujet).

7 votes

Je l'ai réglé comme ceci @Html.TextBoxFor(model => model.CDate, "{0:dd.MM.yyyy}") mais sur httpPost j'obtiens des données comme MM.dd.yyyy. Comment résoudre ce problème ?

258voto

Alexeyss Points 2016
<%= Html.TextBoxFor(model => model.EndDate, new { @class = "jquery_datepicker", @Value = Model.EndDate.ToString("dd.MM.yyyy") })%>

5 votes

La solution EditorFor fonctionne, sauf lorsque vous devez remplacer d'autres attributs HTML comme l'id ou la classe. Cette solution est excellente. Il est étrange que le V doive être en majuscules.

0 votes

Est-ce que cela permet de gérer les valeurs nulles en toute sécurité ?

0 votes

L'inconvénient de cette approche est que la zone de texte sera vide lors du nouveau rendu si l'utilisateur saisit une date non valide. Voir la réponse ci-dessous pour la solution MVC4.

242voto

Kevin Craft Points 1738
[DisplayName("Start Date")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime StartDate { get; set; }

Ensuite :

<%=Html.EditorFor(m => m.StartDate) %>

0 votes

Oui, comme il y a maintenant l'aide EditorFor et que MVC2 est finalisé, votre solution est la bonne.

71 votes

Mais maintenant, le sélecteur de date de Jquery UI ne peut pas être appliqué à cette entrée, car il ignore mes attributs @class="datepicker" tels que spécifiés à l'aide Html.EditorFor(). Ainsi, cette zone de texte a maintenant un format correct, mais elle ne lance pas de sélecteur de date lorsqu'on clique dessus. Il s'agit donc de réparer une chose et d'en casser une autre.

6 votes

Comment puis-je faire en sorte qu'il s'affiche conformément à cette solution, mais aussi qu'il lance le sélecteur de date comme il le faisait avec Html.TextboxFor() ?

48voto

andersjanmyr Points 3436

Ou utilisez les aides non typées :

<%= Html.TextBox("StartDate", string.Format("{0:d}", Model.StartDate)) %>

23 votes

Légère variation @Html.TextBoxFor(model => model.EndDate, "{0:d}", new { type = "date" })

0 votes

Il utilise Razor au lieu du moteur de vue ASPX, mais les deux fonctionnent dans MVC 4 et le passage d'une syntaxe à l'autre est trivial. J'ai posté en Razor parce que c'est ce que j'ai utilisé et testé. Comme je l'ai dit, c'est une variation.

1 votes

@Dan Friedman : C'était la solution pour moi ! J'avais l'habitude de travailler avec un modèle d'éditeur, mais alors je devais aussi créer mon propre html et inclure tous les messages de validation ET tous les attributs Bootstrap, donc c'est vraiment la voie à suivre pour moi (asp.net mvc5).

12voto

Tamas Czinege Points 49277

N'ayez pas peur d'utiliser du HTML brut.

<input type="text" value="<%= Html.Encode(Model.SomeDate.ToShortDateString()) %>" />

4 votes

Comment l'aurait-il affiché à l'époque ? Parce que la date seulement ne sera certainement pas analysée sur le serveur.

10 votes

Tant que vous incluez le bon "name="StartDate"", le classeur modèle le prendra en compte.

0 votes

@DrJokepu la seule chose qui fonctionne pour moi sur MVC3. C'est que je n'ai pas réussi à faire TextBoxFor o EditorFor valeur du format de toute façon. Voir ma question : L'aide TextBoxFor mélange le jour et le mois dans les dates

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X