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
.