Valider une Date dans un format spécifique ASP.NET MVC 3
J'ai une propriété de type DateTime MyDate
dans mon ViewModel. Je veux faire en sorte que l'utilisateur entre la Date de la partie dans une zone de texte dans un format spécifique (jj.mm.aaaa) et essayé les attributs suivants:
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode=true)]
[RegularExpression(@"^(([0-2]\d|[3][0-1])\.([0]\d|[1][0-2])\.[2][0]\d{2})$",
ErrorMessage="Failed...")]
public DateTime MyDate { get; set; }
L'action du contrôleur signature pour un HttpPost ressemble à ceci:
[HttpPost]
public ActionResult Edit(int id, MyViewModel viewModel)
{
//MyViewModel contains the MyDate property ...
//...
if (ModelState.IsValid)
{
//...
}
//...
}
Dans le Rasoir vue, j'ai essayé les deux façons suivantes:
-
@Html.TextBoxFor(model => model.MyDate)
-
@Html.EditorFor(model => model.MyDate)
Il ne fonctionne pas comme je veux. Le résultat est:
- La validation côté Client fonctionne comme prévu avec Html helpers
- Côté serveur de validation échoue toujours pour les deux aides, même avec des dates valides comme "17.06.2011" qui passent à l'expression régulière. Le
MyDate
propriété est rempli correctement avec la date d'entrée enviewModel
qui est passé à l'action. Il semble donc que le modèle de la liaison a été de travail. - La
DisplayFormat
attribut n'est respecté parEditorFor
mais pas parTextBoxFor
.TextBoxFor
affiche "dd.mm.aaaa hh:mm:ss"
Questions:
-
Puis-je appliquer un
RegularExpressionAttribute
tout sur une propriété qui n'est pas unestring
? Si elle est autorisée, comment est le reg ex évaluée pour un non-propriété de chaîne commeDateTime
sur le côté serveur? C'est quelque chose commeMyDate.ToString()
en comparaison avec le reg ex? (Il serait d'expliquer que la validation échoue parce que ToString retourne une chaîne de caractères, y compris la partie du temps qui ne passe pas à l'expression régulière.) -
Est le
DisplayFormat
attribut généralement seulement respectée parEditorFor
et jamais parTextBoxFor
? -
Comment puis-je faire un jour de validation de droite?
Vous devez vous connecter pour publier un commentaire.
Ne pas utiliser des expressions régulières pour valider les dates, ils sont tout simplement ignorés.
Différences dans les cultures pourrait être la racine de votre problème. La validation côté Client utilise le navigateur de la culture afin de valider la date. Ainsi, par exemple, s'il est configuré pour
en-US
le format attendu seraitMM/dd/yyyy
. Si votre serveur est configuré pour utiliserfr-FR
le format attendu seraitdd/MM/yyyy
.Vous pouvez utiliser le
<mondialisation>
élément dans le web.config pour définir le côté serveur de la culture. Vous pouvez configurer de telle sorte qu'il utilise la même culture que le client:Hanselman a un nice post de blog au sujet de la mondialisation et de la localisation dans ASP.NET MVC.
DateOnly
attribut (voir ma propre réponse ici). Sélecteur de Date est une meilleure aide pour l'utilisateur! Je vais essayer de l'une des prochaines étapes.J'ai maintenant jeté l'
RegularExpression
. Il ne semble pas être adapté sur une propriété de typeDateTime
. Puis j'ai créé une nouvelle validation de l'attribut DateTime et nullable DateTime:Utilisation:
Il ne permet pas la validation côté client. Côté serveur, la validation s'appuie sur le modèle de liaison (assurez-vous que la chaîne saisie est modulable pour une
DateTime
à tous). Si l'utilisateur a entré une fois partie, à l'exception de minuit, leDateOnly
attribut de coups de pied dans, elle reçoit un avertissement que seule une date doit être saisie.