2 votes

Afficher le format Appliquer le format en mode édition

Je utilise MVC 3 en C#, j'ai une classe avec cet attribut

[DisplayFormat(DataFormatString = "{0:dd MMM yyyy}", ApplyFormatInEditMode = true)]

Je voudrais imposer la validation lorsque un utilisateur est en MODE ÉDITION

Les données dans la base de données sont stockées avec le type datetime formaté comme ça

  6/15/2009 1:45:30 PM

Je reçois cette erreur

La chaîne d'erreur n'est pas dans le bon format

Je crois que le problème se situe dans

DataFormatString = "{0:dd MMM yyyy}"

avez-vous une idée de comment le corriger ?

6voto

Yarx Points 5999

L'attribut DisplayFormat est littéralement uniquement pour afficher la valeur. Si vous définissez le ApplyFormatInEditMode, tout ce qu'il fera est également d'appliquer le format au contenu de vos données lorsqu'il est affiché dans une zone de texte (destinée à la modification). Cela n'a rien à voir avec la validation.

Si vous souhaitez valider l'entrée en utilisant le format que vous avez spécifié, vous devrez probablement créer votre propre ValidationAttribute, et utiliser DateTime.ParseExact() pour tenter de vous assurer qu'il correspond au format que vous attendez. Le seul inconvénient est qu'il n'aura pas de logique de validation côté client sauf si vous l'écrivez.

Je n'ai pas testé cela en détail, mais cela devrait vous donner un bon point de départ.

public class DateTimeFormatAttribute : ValidationAttribute
{
   public int Format { get; set; }

   public override bool IsValid(object value)
   {
        if (value == null)
            return true;

        DateTime val;
        try
        {
            val = DateTime.ParseExact(value.ToString(), Format, null);
        }
        catch(FormatException)
        {
            return false;
        }

        //Pas tout à fait sûr que cela atteindrait jamais ce point, mais j'ai besoin d'une instruction de retour dans tous les cas de code
        return val != DateTime.MinValue;
   }
}

Ensuite, il suffit de l'utiliser. [DateTimeFormat(Format = "dd MMM yyyy")]

MISE À JOUR : Désolé, je ne pense pas avoir clairement lu votre question. La raison pour laquelle il se plaint des données lors de la soumission est que le format que vous essayez d'utiliser n'est pas un format standard. Vous feriez mieux de mettre en œuvre l'un des sélecteurs de date courants en ligne à utiliser lors de la population du champ plutôt que de le laisser être édité manuellement ou en vous attendant à un format non standard comme celui-ci. Les formats d'affichage personnalisés sont excellents pour l'affichage, mais si vous voulez utiliser un format personnalisé pour le mode d'édition que le DateTime.Parse par défaut ne comprend pas, vous devrez probablement écrire votre propre ModelBinder, je crois, et ce n'est quelque chose que je n'ai pas fait. Alternativement, vous pourriez changer le type de données sur votre viewmodel en string et le parser vous-même dans la méthode d'action (vous pourriez toujours utiliser le validateur que j'ai fourni dans ce cas). Pour vous débarrasser de votre erreur (mais cela supprimera également votre format personnalisé en mode édition), vous devriez supprimer la propriété ApplyFormatInEditMode.

0voto

Dustin Reid Points 56

0:dd MMM yyyy va s'attendre à une chaîne comme 06 JUN 2009 au lieu de 6/15/2009.

Comment entrez-vous la chaîne lorsque vous obtenez l'erreur Chaîne non dans le format correct?

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