35 votes

Format Date On Binding (ASP.NET MVC)

Dans mon ASP.net MVC application j'ai un affichage qui ressemble à ceci:

...
<label>Due Date</label>
<%=Html.TextBox("due")%>
...

Je suis à l'aide d'un ModelBinder de lier la poster sur mon modèle (en raison de la propriété est de DateTime type). Le problème, c'est quand j'ai mis "01/01/2009" dans la zone de texte, et la poste ne valide pas (en raison d'autres données d'entrée incorrecte). Le classeur se remplit à nouveau, avec la date et de l'heure "01/01/2009 00:00:00".

Est-il possible de dire le classeur au format de la date correctement (c'est à dire ToShortDateString())?

55voto

Nick Chadwick Points 551

Je viens de tomber sur ce très solution simple et élégante, disponible en MVC 2:

http://geekswithblogs.net/michelotti/archive/2010/02/05/mvc-2-editor-template-with-datetime.aspx

Fondamentalement, si vous êtes en utilisant MVC 2.0, utilisez la commande suivante dans votre point de vue.

 <%=Html.LabelFor(m => m.due) %>
 <%=Html.EditorFor(m => m.due)%>

ensuite, créez une vue partielle en /Views/Shared/EditorTemplates, appelé DateTime.ascx

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime?>" %>
<%=Html.TextBox("", (Model.HasValue ? Model.Value.ToShortDateString() : string.Empty), new { @class = "datePicker" }) %>

Lorsque le EditorFor<> est appelé, il va trouver un correspondant de l'Éditeur de Modèle.

24voto

Quoo Points 510

Décorez la propriété dans votre modèle avec l'attribut DataType et spécifiez qu'il s'agit de Date et non de DateTime :

 public class Model {
  [DataType(DataType.Date)]
  public DateTime? Due { get; set; }
}
 

Vous devez également utiliser EditorFor au lieu de TextBoxFor dans la vue:

 @Html.EditorFor(m => m.Due)
 

9voto

Cephas Points 495

C'est un sale bidouillage, mais cela semble fonctionner.

 <%= Html.TextBoxFor(model => model.SomeDate,
    new Dictionary<string, object> { { "Value", Model.SomeDate.ToShortDateString() } })%>
 

Vous obtenez la liaison de modèle et pouvez remplacer la propriété HTML "valeur" du champ de texte par une chaîne mise en forme.

4voto

Casper Points 849

Pourquoi n'utilisez-vous pas

 <% =Html.TextBox("due", Model.due.ToShortDateString()) %>
 

4voto

Craig M Points 3011

J'ai trouvé cette question en cherchant moi-même la réponse. Les solutions ci-dessus n'ont pas fonctionné pour moi car mon DateTime est nullable. Voici comment j'ai résolu le problème avec la prise en charge des objets DateTime nullables.

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

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