2010-03-29 5 views

Répondre

2

Utilisez une classe ViewModel spécifique qui a une chaîne dans le format que vous voulez pour l'anniversaire et l'utiliser pour afficher dans la zone de texte. Lorsque vous publiez le formulaire, si vous utilisez la liaison par défaut pour l'objet de domaine lui-même, il doit analyser la chaîne pour vous. Si vous utilisez un ViewModel, vous devrez l'analyser en postant le formulaire.

+0

Cela semble faux pour que cela ne soit pas visible dans la vue. Le point entier d'une vue dans MVC est de manipuler ce genre de manipulations. ASP.NET MVC v2 est-il vraiment à courte vue? (Bien sûr, ne vous offensez pas malgré mon ton textuel ici - je suis juste choqué que ce n'est pas une chose triviale à faire!) – Jaxidian

+0

Je vois votre point, mais je pense qu'une classe ViewModel est censé contenir des informations spécifiques logique et traduire le concept d'entreprise de la date en représentation de chaîne pour l'affichage. La vue elle-même est juste le HTML et affiche les représentations de la chaîne. –

+0

Ne vous méprenez pas, je n'ai rien contre un ViewModel et son existence dans MVC au niveau View, mais cela devrait être pour des choses plus complexes que le simple formatage d'une date. – Jaxidian

4

Dans votre modèle, vous pouvez utiliser les métadonnées System.ComponentModel.DataAnnotations pour spécifier le format dans lequel vous voulez placer la propriété.

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

Then, in your view, use: 
<%= Html.EditorFor(model => model.Birthday) %> 

Malheureusement, les Helpers HTML réguliers ne respectent pas les métadonnées, donc vous devez utiliser Html.EditorFor.

+0

Données utiles Tag d'annotation que je ne connaissais pas, cependant, je refuse de mettre ceci dans mon modèle parce que je fais mal MVC. Dans mon ViewModel, peut-être, mais je n'aime toujours pas cette solution car elle appartient absolument à la vue et nulle part ailleurs. +1 pour l'info, cependant. – Jaxidian

0

J'ai été un peu surpris de voir que vous ne pouvez pas simplement lancer une chaîne de format dans Html.EditorFor(). J'ai commencé à utiliser EditorTemplates.

Créez une structure de répertoires dans votre solution.

> Vues partagées> EditorTemplates

Ajouter un nouveau contrôle utilisateur MVC 2 dans le dossier EditorTemplates et nommez-le DateTime.ascx. Html.EditorFor (DateTime) va maintenant utiliser ce contrôle utilisateur pour l'affichage.

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

Et cela fonctionne pour la liaison dans les deux sens? c'est-à-dire lorsque vous postez, la valeur que vous entrez ici est renvoyée dans le modèle? – Jaxidian

+0

Oui, c'est le cas. Donc, disons que vous en faites un pour Decimal et formatez votre zone de texte en devise. Sur votre méthode de publication, vous devrez supprimer le signe dollar ou ModelState.IsValid retournera false. – JasperLamarCrabb

Questions connexes