2009-03-17 6 views
1

Je crée un contrôle utilisateur Web personnalisé en C#. Il est prévu d'interagir avec une hiérarchie d'autorisations. Nous avons différents "sites" et chaque site a de nombreuses "applications" et chaque application a beaucoup de "permissions"Les nœuds TreeView semblent être mis en cache

Donc, nous avons un onglet qui charge un onglet pour chaque site. Ensuite, dans chaque onglet, nous avons un TreeView où les nœuds parents sont les applications et les nœuds internes sont les autorisations.

Les autorisations affichent des cases à cocher en fonction de certains critères et sont vérifiées selon que la fonction HasPermission renvoie ou non la valeur true.

Tout ce code fonctionne ... mais seulement pour le premier utilisateur sélectionné. Pour tout utilisateur ultérieur choisi, un pas dans le débogueur montre toute la logique correcte en cours d'exécution, mais la page affiche les mêmes informations que celle du premier utilisateur sélectionné. Donc, en gros, c'est économiser l'affichage quelque part ... et je ne sais pas où trouver.

public partial class Permissions : System.Web.UI.UserControl 
{ 
    string _NTLogin; 
    CoreUser _User; 
    bool _IsAdmin; 
    public string NTLogin 
    { 
     get 
     { 
      return _NTLogin; 
     } 
     set 
     { 
      ViewState["NTLogin"] = value; 
      _NTLogin = value; 
     } 
    } 
    public bool IsAdmin 
    { 
     get 
     { 
      return _IsAdmin; 
     } 
     set 
     { 
      ViewState["IsAdmin"] = value; 
      _IsAdmin = value; 
     } 
    } 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
    public void LoadTabs() 
    { 
     string [] sites = MISCore.BusinessLayer.CorePermission.GetSites(); 
     foreach (string site in sites) 
     { 
      TabPanel tp = new TabPanel(); 
      tp.HeaderText = site; 
      TabContainer1.Tabs.Add(tp); 
     } 
    } 
    public void LoadTrees() 
    { 
     if(_User == null) 
      return; 
     TabPanelCollection tabs = TabContainer1.Tabs; 
     foreach (TabPanel tab in tabs) 
     { 
      string site = tab.HeaderText; 
      string[] apps = MISCore.BusinessLayer.CorePermission.GetApplications(site); 
      TreeView tv1 = new TreeView(); 
      tv1.EnableViewState = false; 
      foreach (string app in apps) 
      { 
       TreeNode tn1 = new TreeNode(app); 
       tn1.SelectAction = TreeNodeSelectAction.None; 
       string[] perms = MISCore.BusinessLayer.CorePermission.GetPermissions(site, app); 
       foreach (string perm in perms) 
       { 
        TreeNode tcn1 = new TreeNode(perm); 
        tcn1.SelectAction = TreeNodeSelectAction.None; 
        if (IsAdmin || _User.Manager.HasPermission(site, app, perm)) 
        { 
         tcn1.ShowCheckBox = true; 
         if (_User.HasPermission(site, app, perm)) 
         { 
          tcn1.Checked = true; 
         } 
         else 
         { 
          tcn1.Checked = false; 
         } 
        } 
        else 
        { 
         tcn1.ShowCheckBox = false; 
        } 
        tn1.ChildNodes.Add(tcn1); 
       } 
       tv1.Nodes.Add(tn1); 
      } 
      tab.Controls.Add(tv1); 
     } 

    } 
    protected override void LoadViewState(object savedState) 
    { 
     base.LoadViewState(savedState); 
     _NTLogin = (string)ViewState["NTLogin"]; 
     _IsAdmin = (bool)ViewState["IsAdmin"]; 
     if(_NTLogin != null) 
      _User = new CoreUser(_NTLogin); 
     TabContainer1.Tabs.Clear(); 
     LoadTabs(); 
     LoadTrees(); 
    } 
} 

[UPDATE] J'itérer le treeview après tout le code ci-dessus, il stocke correctement leur état correct. C'est un problème avec l'affichage. Je peux changer avec succès n'importe quelle autre propriété, tooltip, texte, etc. pour montrer leur état, mais les cases à cocher ne mettent pas à jour ...

Répondre

0

J'utiliserais Fiddler pour voir qui met en cache les résultats. En regardant les demandes, vous serez en mesure de dire si c'est le navigateur ou le serveur à l'origine du problème.

0

Ou si c'est bon pour votre client, vous pouvez mettre dans un petit bouton de lien qui dit rafraîchir, et vous ou l'utilisateur pouvez forcer cette méthode d'arborescence d'actualisation, chaque fois que nécessaire.

0

Devrait être assez simple, dans les paramètres de l'onglet suffit d'ajouter EnableViewState = false. Faites-moi savoir si cela fonctionne pour vous.

Questions connexes