Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    asp.net c# Problema con il viewstate in un controllo web

    Ciao
    Vorrei fare un controllo utente dove creo il menu della navigazione per il mio sito. Ho creato dinamicamente dei LinkButton che puntano tutti alla pagina principale (Default.aspx) e li ho messi in un place holder nel menu.
    Vorrei quindi valorizzare una variabile nel viewstate nella pagina principale che carica dei componenti a seconda del valore passato dal link(premetto che vengo da programmazione in asp classico; in asp avrei incluso una pagina o l'altra a seconda di un valore passato direttamente sul link es href="default.aspx?variabile=valore" [che preferirei evitare per questioni di sicurezza]).
    Per fare questo ho aggiunto nell'evento dei link button un valore al viewstate; quando però cerco di recuperare il valore nella pagina default.aspx non lo vede. Il viewstate allora funziona solo nella classe principale? Esiste un'alternativa rispetto all'uso dei parametri passati sull stringa dell'url?
    Grazie

    menu.ascx
    codice:
    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="Menu.ascx.cs" Inherits="Menu" %>
    <div id="menu">
    <asp:PlaceHolder ID="MyPlaceHolder" runat="server">
    </asp:PlaceHolder>
    </div>
    menu.ascx.cs
    codice:
        //Funzione OnClick dei link del menu
        protected void LinkButton_Click(object sender, EventArgs e)
        {
            LinkButton lb = (LinkButton)sender;
            ViewState["action"]=lb.ID;
        }
    
        protected void Page_Init()
        {
            this.connettiDb();
            DbDataReader res_rows = this.eseguiQuery("SELECT * FROM Menu WHERE figlioDi=0");
            int intv;
            string voce;
            int id;
            while (res_rows.Read())
            {
                intv = res_rows.GetOrdinal("Voce");
                voce = (string)res_rows.GetValue(intv);
                intv = res_rows.GetOrdinal("ID");
                id = (int)res_rows.GetValue(intv);
    
                LinkButton btnLnk = new LinkButton();
                btnLnk.Text = voce;
                btnLnk.Visible = true;
                btnLnk.Command += new CommandEventHandler(this.LinkButton_Click);
                btnLnk.ID = id.ToString();
                btnLnk.PostBackUrl = "Default.aspx";
                btnLnk.Attributes.Add("class", "menu_padre");
    
                MyPlaceHolder.Controls.Add(btnLnk);
            }
            res_rows.Close();
            this.chiudiDb();
        }
    }
    Default.aspx
    codice:
    public partial class _Default : System.Web.UI.Page 
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string str = (string)ViewState["action"];
            try
            {
               num  = Int16.Parse(str);
            }
            catch (Exception e1)
            { num = -1; }
            switch (num)
            {
                case 1:
             * 
                    break;
                case 2:
             * 
                    break;
                case 3:
             * 
                    break;
            }
        }
    }

  2. #2
    Ho risolto parte del problema mettendo nel file .ascx una variabile pubblica tipo string che richiamo poi nella pagina aspx. Ora riesco a far vedere la variabile alla pagina ma devo cliccare 2 volte sul link...

    pagina .ascx:
    codice:
     
       [Bindable(true)]
        [DefaultValue("")]
        [Localizable(true)]
        public string action
        {
            get
            {
                String s = (String)ViewState["action"];
                return ((s == null) ? "[" + this.ID + "]" : s);
            }
    
            set
            {
                ViewState["action"] = value;
            }
        }
    pagina .aspxMenu1 è il nome dell'istanza del mio user control)
    codice:
    string str = Menu1.action;

  3. #3
    Come non detto in realtà funziona. Io stavo provando a inserire dei response.wite per verificare l'effettivo funzionamento del viewstate. Ho provato invece a includere direttamente dei controlli a seconda del parametro passato e così sembra funzionare...

  4. #4
    Cm non detto continua a darmi lo stesso problema

  5. #5
    Mi sono accorto che questa soluzione non può funzionare in quanto il rendering del controllo con la variabile viene fatto dopo l'evento on-load della pagina, quindi la variabile non viene valorizzata all'inizio e quindi funziona solo dopo il secondo click. L'unico metodo è usare le master page e i place holder.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.