2010-03-17 4 views
1

Je n'arrive pas à comprendre pourquoi le code suivant ne fonctionne pas. Je suis sûr que c'est quelque chose de réparateur qui me manque ou que je ne comprends pas. J'ai actuellement une page qui demande l'entrée de l'utilisateur. Si, en fonction de l'utilisateur d'entrée et connecté, je trouve déjà des données de cette page dans la base de données, j'ai besoin de mettre à jour les enregistrements existants plutôt que d'en créer de nouveaux, donc j'ai défini un booléen comme vrai. Le problème est, quand MyNextButton est cliqué, PreviouslySubmitted est toujours faux. Donc, je ne sais pas comment faire pour que la valeur de cette variable persiste. Tout conseil est apprécié, merci.Définition de la variable de niveau classe à utiliser entre les gestionnaires d'événements

public partial class MyForm : System.Web.UI.Page 
{ 
    private bool PreviouslySubmitted; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     MyButton.Click += 
      (o, i) => 
      { 
       q = from a in db.TableA 
        where (a.SomeField == SomeValue) 
        select a; 

       if(q.Any()) 
       { 
        PreviouslySubmitted = true; 
        //populate the form's fields with values from database for user to revise 
       } 
      } 

     MyNextButton.Click += 
      (o, i) => 
      { 
       //the value of PreviouslySubmitted is false at this point, 
       //even if I made sure it was set to true the previous postback 

       if(PreviouslySubmitted) 
       { 
        //update database 
       } 
       else 
       { 
        //insert into database 
      } 
    } 
+0

Où 'PreviouslySubmitted' est-il déclaré et/ou défini sur 'false'? Je suppose que 'q.Any()' renvoie return et définit la variable. – ChrisF

+1

Si la valeur par défaut de PreviouslySubmitted est false, il se peut que vous interceptiez l'événement de bouton MyNextButton.click d'une instance différente de la classe. Voyez quand votre constructeur est appelé. – Ando

+0

@Chris - J'ai ajouté la déclaration de classe et bool pour plus de clarté. –

Répondre

1

Déclarez la variable précédemment Soumis comme statique.

Mise à jour importante
Je suis désolé, je vérifie pas « basé sur l'entrée et utilisateur connecté » partie de la question. Pourquoi cela fonctionne est simple: il n'y a pas d'état partagé entre les demandes et les publications de la page - c'est un manque de protocole HTTP. Par conséquent, les contrôles d'état des pages sont en cours de reconstruction à chaque requête à l'aide du mécanisme ViewState, mais pas vos propres objets, champs et variables. Chaque requête de page (visiteur) a sa propre instance de classe MyForm, mais les variables statiques sont communes à tous les. Supprimez donc le mot-clé static et utilisez ViewState/SessionState pour stocker la valeur de la variable PreviouslySubmitted par utilisateur.

+0

Quelqu'un pourrait-il expliquer pourquoi cela fonctionne? –

+0

Gotcha, merci beaucoup. –

0

Votre code crée deux gestionnaires d'événements. Êtes-vous sûr qu'ils sont appelés dans l'ordre que vous attendez? Si le second a été appelé en premier, vous rencontrerez ce problème. Vous devriez probablement combiner le code pour les deux gestionnaires d'événements en un seul.

+0

Oui, sur la première page, l'utilisateur sélectionne une valeur, soumet. Le gestionnaire d'événement pour ce soumettre est le premier répertorié. Après avoir révisé le formulaire, l'utilisateur clique sur un autre bouton d'envoi, qui déclenche le second. Bien que PreviouslySubmitted ait été défini sur true le gestionnaire d'événements précédent, la valeur ne persisterait pas dans ce second gestionnaire d'événements. Je l'ai déclaré statique, comme suggéré par Artem, et cela fonctionne, mais je ne sais pas pourquoi. –

Questions connexes