2017-09-19 4 views
-1

Dans ma demande de test je un champ datetime défini comme tel:DateTime accepte plus de 4 chiffres pour l'année

[Required(ErrorMessage = "This is required")] 
[Display(Name = "test date:")] 
[DataType(DataType.Date)]   
[DisplayFormat(DataFormatString = "{0:dd/MMMM/yyyy}", ApplyFormatInEditMode = true)] 
public DateTime? date1 { get; set; } 

et à mon avis:

@Html.EditorFor(
    model => model.date1, 
    new { 
     htmlAttributes = new { 
      @Value = Model.date1 != null ? Model.date1.Value.ToString("yyyy-MM-dd") : "" 
     } 
    }) 
@Html.ValidationMessageFor(model => model.date1, "", new { @class = "text-danger" }) 

Tout fonctionne bien, mais quand je rentre une date comme 10/03/19999 (jj, MM, aaaa), l'application se brise, évidemment la date que j'ai entré est fausse mais je ne suis pas sûr de la façon d'agir l'erreur. J'ai essayé d'utiliser datetime.tryparse pour la publication en cas d'échec mais ensuite je perds avec quoi j'ai rempli le formulaire.

Update:

la solution suivante quadzz, j'ai essayé:

[Required(ErrorMessage = "This is required")] 
[Display(Name = "test date:")] 
[DataType(DataType.Date)] 
[Range(typeof(DateTime), "1/1/1900", "31/12/2000", ErrorMessage = "Value for {0} must be between {1} and {2}")] 
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] 

mais il ne fonctionne toujours pas.

+0

Pourquoi est-ce faux?Assurez-vous que cela va être LONGTEMPS avant d'arriver à 10000 mais un jour .. – BugFinder

+1

Définir "les pauses de l'application" – Charleh

+0

'DateTime' prend en charge l'année jusqu'à 9999. Si l'année est plus que cela, il a considéré le débordement (et peut jeter exception). Vous pouvez créer une structure personnalisée similaire à 'DateTime' avec une propriété' Year' à 5 chiffres, mais il semble que vous deviez déclarer plusieurs méthodes 'DateTime' dans la structure. –

Répondre

2

Essayez de parcourir votre champ de date/heure. Référence ici: https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.rangeattribute.aspx

Exemple:

[Range(typeof(DateTime), "1/1/2000", "1/1/2010", 
     ErrorMessage = "Value for {0} must be between {1:d} and {2:d}")] 
    [DataType(DataType.Date)] 
+0

J'ai essayé cette solution, mais cela ne fonctionne pas? J'ai mis à jour ma réponse à ce que j'ai fait – rem

+0

Ceci est faux, et un attribut' [Range] 'ne fonctionne même pas pour les dates dans le client –

0

Quelques solutions:

Ajouter la validation côté client pour vérifier la date avant de l'envoyer au serveur (et bien sûr garder la validation de serveur fais maintenant aussi bien). En faisant cela, vous réduisez votre problème à un nombre presque insignifiant de cas (les utilisateurs qui n'ont pas javascript activé et entrez une mauvaise date).

Ou une autre solution:

Changer votre champ date1 à une chaîne. Si votre date n'est pas correcte, renvoyez la valeur d'origine sur votre page. Puis, dans votre éditeur, vous n'affichez qu'un champ de texte normal, vous n'avez pas besoin de faire de conversion.

1

Effectuez la validation côté client avant d'envoyer des données au serveur. Bien que la validation côté serveur est également requis votre scénario pourrait être pris en charge par la validation du côté client pour cette fin: les fichiers suivants js dans le fichier de mise en page

  1. jquery
  2. jquery.validate
  3. jquery.validate.unobtrusive

donc votre point de vue devrait être comme

@Html.EditorFor(
    model => model.date1, 
    new { 
     htmlAttributes = new { 
      @Value = Model.date1 != null ? Model.date1.Value.ToString("yyyy-MM-dd") : "", 
      @Readonly="readonly" 
     } 
    }) 
@Html.ValidationMessageFor(model => model.date1, "", new { @class = "text-danger" }) 

J'ai fait re de l'éditeur adonly afin que l'utilisateur sélectionne la date de la bibliothèque datepicker (l'entrée manuelle de la date est interdite) [Bien que facilement accessible]

Si la validation côté client est réussie ou si le client envoie des données en désactivant javascript, vous devez effectuer une validation côté serveur être fait dans le contrôleur en vérifiant ModelState

[HttpPost] 
public ActionResult Employee(EmployeeModel employee) 
{ 
    if(ModelState.IsValid) 
    { 
    //Everything is good to process 
    } 
    return View(employee);//returns view with model error if any 
}