2017-08-16 3 views
1

Je vais avoir un problème avec une validation côté serveur avec Pages Razor (ASP.Net Core 2.0)Pages rasoir sur serveur de validation de retour pour certains champs sans

J'ai une page qui crée un enregistrement

http://localhost:56876/Entries/Create?employeeID=112345

mon code derrière le fichier pour le onget ressemble:

 [BindProperty] 
     public EntryLog EntryLog { get; set; } 
     public Employee Employee{ get; set; } 
     public string empID { get; set; } 

    public IActionResult OnGet(string employeeID) 
     { 
     empID = employeeID; 
// for Selects for lookup tables 
     ViewData["ReasonId"] = new SelectList(_context.Reason, "Id", "Name"); 
     ViewData["ReasonTypeId"] = new SelectList(_context.ReasonType, "Id", "Name"); 
      return Page(); 
     } 

le code ci-dessus fonctionne très bien et travaille la validation client parfait, mais je validation de la logique métier que si la date d'entrée est 90 entre la date d'aujourd'hui et la date d'embauche que je ne devrais pas laisser l'entrée à enregistrer. Ma validation côté serveur fonctionne mais le problème est que lorsque je renvoie Page(); Le formulaire est actualisé et les deux éléments sélectionnés sont vides et l'élément EmployeeID est également vide.

Ma conjecture est que le retour Page() sur OnPostAsync() n'appelle pas la méthode OnGet().

Comment puis-je conserver la page telle quelle sans perdre l'information?

+0

Vous n'avez pas de modèle pour votre méthode? – Hadee

Répondre

0

Vous avez raison le return Page() n'appelle pas la méthode OnGet(). Je vais essayer d'expliquer ce qui se passe:

Réponse courte:

Lorsque vous recevez la demande Post (OnPost()) et return Page() le serveur retourne juste la réponse (html), il ne fait pas une nouvelle Get Request pour que OnGet() soit appelé à nouveau.

Les deux éléments sélectionnés sont en cours de nettoyage car ils sont configurés en OnGet() à ViewData (c'est-à-dire temporaires) et non en OnPost(). Ma suggestion est que vous définissez les "sélections" à nouveau sur OnPost() (extraire une méthode pour le rendre plus facile).

Réponse longue:

Lorsque vous accédez à votre page (Entrées/Créer) en tapant ou être redirigé par un lien, la demande de navigateur la page au serveur en utilisant GET méthode HTTP qui appellera OnGet méthode . Ensuite, lorsque vous envoyez votre formulaire (en considérant method="POST") la demande sera envoyée au serveur et sera interceptée par la méthode OnPost. Lorsque vous codez return Page(), il ne renvoie pas une réponse au navigateur en disant "Hey, vous devez faire une demande GET à nouveau (ce qui ferait OnGet être appelé à nouveau)", il renvoie la réponse de fin (html) lui-même. C'est pourquoi OnGet() n'est pas appelé. Ce qui ferait que le OnGet() soit appelé à nouveau serait return RedirectToPage("./Entities/Create"), mais vous perdriez ainsi votre état de modèle (résultat de validation).

Les deux éléments sélectionnés sont en cours de nettoyage car ils sont configurés en OnGet() à ViewData (c'est-à-dire temporaires) et non en OnPost(). Ma suggestion est que vous définissez les "sélections" à nouveau sur OnPost() (extraire une méthode pour le rendre plus facile).

Cordialement.

+0

merci. Je l'ai compris mais bonne explication. – causita

+0

Je n'arrivais pas à faire fonctionner les selectboxes onPost, quelqu'un d'autre? –