8
votes

Le champ membre privé ASP.NET perd la valeur sur le post-plan

Considérez le code suivant:

    public partial class TeacherControlPanel : System.Web.UI.Page
    {
        protected string username = string.Empty;

        protected void Page_Load(object sender, EventArgs e)
        {
            username = (string)Request.QueryString["username"];

            Ice_Web_Portal.BO.Teacher teacher = Ice_Web_Portal.BO.Teacher.GetTeacherByUsername(username);

            if (teacher != null)
            {
                labUsername.Text = username;
                labName.Text = teacher.TeacherName;
                labTeacherCode.Text = teacher.TeacherCode;

                Dept dept = teacher.Department;

                if (dept != null)
                {
                    labDepartment.Text = dept.DeptName;
                }
            }
            else
            {
                //labErrorMessage.Text = "No teacher found";
            }
        }

        protected void btnSendMail_Click(object sender, EventArgs e)
        {
            Response.Redirect(@"~/Teacher/TeacherComposeMail.aspx?username=mahabub" + username);            
        }
}


8 commentaires

Dites-vous que le code fonctionne comme écrit, mais lorsque vous modifiez le nom d'utilisateur à une variable privée, elle échoue?


Est-ce initialisé à NULL ou à String.empty?


@Fredou, obtenir les données d'un enseignant par son nom d'utilisateur unique. Pas de classe partielle.


JMSA - Le problème est probablement dans le code que le post-pack, cela semble bien. S'il vous plaît poster ce code.


@Chris galets, oui tu l'as eu.


Pouvez-vous nous montrer le code qui ne fonctionne pas? Simplement basculer sur Privé ne devrait pas avoir de roulement. Il ne devrait pas y avoir de type de sérialisation des choses en arrière-plan (ce qui aurait pu expliquer des choses).


@John Fisher, il suffit de le faire 'Nom d'utilisateur à chaîne privée = string.empty;'


@John Fisher, aucune de mes classes n'est sérialisable.


3 Réponses :


16
votes

Parce que ASP.NET est apatride SIGNALITÉ SIGNALITÉ SIGNALITÉ Il ne conserve pas l'état de post-retour à la publication. Enregistrez l'utilisateur à la vue de la vue, de la session ou de l'application pour la voir sur le post-plan de publication. XXX


2 commentaires

Mais il fait Nom d'utilisateur = (String) Demande.Quiserystring ["Nom d'utilisateur"]; sur chaque page de page.


@David Basarab, je ne demande pas de solution. J'essaie de connaître la différence d'effet BTWN. protégé vs privé dans ce cas.



6
votes

Chaque fois que vous effectuez un message post-pack, même pour des choses "simples" telles que le bouton, cliquez sur Events, vous travaillez avec un nouvel instance de la classe de page. C'est ASP.NET 101.


2 commentaires

Si vous redirigez vers une nouvelle page ou chargez une page avec une nouvelle chaîne de requête, ce n'est pas un post-plan. Si vous traitez une touche, cliquez sur l'événement sur une page avec une chaîne de requête, une chaîne de post-retour et la chaîne de requête est envoyée avec la requête HTTP de publication. De toute façon, c'est toujours une nouvelle instance de la classe de page.


Je n'ai pas trouvé ma réponse relative à protégée vs privée.



1
votes

déclarer le champ Nom d'utilisateur comme privé ou protégé n'a aucune incidence sur cette situation. Le seul porteur protégé / privé aurait été l'accessibilité de la variable en dehors de la classe ou des membres hérités.

Je crois que cela est probablement un problème de cycle de vie.

Lorsque vous naviguez vers cette page pour la première fois, le nom d'utilisateur n'aura qu'une valeur si la chaîne de requête a été définie pour la demande. Donc, "/teachercontrolpanel.aspx" aura un nom d'utilisateur sans valeur, mais "/teachercontrolpanel.aspx?username=SomeSername". Dans ces cas, le nom d'utilisateur sur le terrain n'aura qu'une valeur si l'une est définie. Et si aucune querystring n'est définie, alors lorsque la page traite le bouton Cliquez sur l'événement, la charge incendie, aucune chaîne de requête ne signifie que le nom d'utilisateur sera NULL, ce qui signifie que l'événement de clic n'aura rien à ajouter à la chaîne de redirection. < / p>

La question est donc la suivante: dans votre application, quel chemin de navigation utilisez-vous pour vous rendre à EnseformControlPanel.aspx?


1 commentaires

De plus, un champ protégé sera visible sur la page (EnseformControlPanel.aspx, sur <%%> déclarations), tandis qu'un champ privé n'est pas.