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

    Passare la tessa variabile tra context, masterpage e aspx

    Salve,
    Vorrei istanziare un oggetto che sia il medesimo per la masterpage sia per i context e le pagine aspx. Ovviamente istanziandolo una volta sola e non in ogni context,masterpage,aspx.

    Per fare un esempio ho un ID passato nel Request["IDPW"] e con quello costruisco l'oggetto PaginaWeb. Ad ora chiamo all'inizio di ogni context, masterpage, aspx un metodo che crea l'oggetto, mentre io vorrei avere "un qualcosa" che crei inizialmente una volta l'oggetto e che poi vega passato ad ogni context, masterpage, aspx.

    NB. Avevo risolto usando un metodo static ma purtroppo ho capito che non è una buona soluzione per problemi di concorrenza al metodo.

    Vi ringrazio per l'aiuto
    abbasso la ridondanza

  2. #2
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    puoi usare la Dictionary Session per le variabili di sessione e la Application per le variabili globali all'intera applicazione (Dal messaggio sinceramente non è chiaro cosa tra le due ti serve).

    codice:
    Session["IDPW"] = Request["IDPW"];
    l'oggetto application è simile ma è meglio usare lock e unlock:

    codice:
    Application.Lock();
    Session["IDPW"] = Request["IDPW"];
    Application.Unock();
    Puoi rendere il tutto strongly typed e thread-safe creando una classe con proprietà static e wrappando tutto dentro i get e set

    codice:
    public class CustomApplication //o CustomSession il discorso nn cambia
    {
        static CustomApplication()
        {
            Application["IDPW"] = 0;//valore di default
        }
    
        public static int IDPW
        {
            get
            {  //Se non avessi inizializzato la variabile nel costruttore, magari perche non è un tipo value
               //allora qui ci sarebbe stato un bell if (Application["IDPW"] == null) Application["IDPW"] = new ecc. ecc. 
                return (int)Application["IDPW"];
            }
            set
            {
                Application.Lock();
                Application["IDPW"] = value;
                Application.Unlock();
            }
        }
    }
    a questo punto non ti resta che usare in giro per la tua appplicazione la classe CustomApplication (o CustomSession).

    Se ti crei questa classe in un namespace diverso e intendi usarela anche nelle aspx oltre che nel code behind puoi rendere il namespace visibile dal web.config:
    codice:
        <system.web>
          <namespaces>
            <add namespace ="Nome_Namespace" />
          </namespaces>
        </pages>  
     </system.web>

  3. #3
    Grazie rsdpzed,
    le tue opzioni sono interessanti, ma ma non mi convincono del tutto:

    - la sessione serve per mantenere dei dati da una visita di una pagina all'altra, invece io volevo un contenitore per i dati di una singola visita ad una pagina, che con molte ore di ricerca ho trovato essere

    HttpContext.Current.Items["paginaweb"] = value

    - Rigurado il locK

    Application.Lock();
    Application["IDPW"] = value;
    Application.Unlock();

    mi piace come scelta ma se il mio DB/CMS gestisce più siti(centinaia) farei una coda immensa su quell' oggetto.

    Cmq grazie perché con le poche specifiche che avevo dato ovviamente erano buone opzioni.

    ....

    Quindi sono arrivato ad avere(penso) il contenitore che volevo cioè:

    HttpContext.Current.Items["paginaweb"] = value;

    ora mi manca solo sapere quando e dove inizializzarlo in modo poi di passarlo a tutti .ashx, .aspx, .master; cosi raggiungendo il mio obbiettivo di avere un oggetto PaginaWeb istanziato una volta e richiamabile da tutte le componenti .ashx, .aspx, .master.

    Grazie per l'aiuto

  4. #4
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    ciao Leonardo, allora credo che quello che ti serve è implementare una cache-per-request. Visto il ritardo non so se ti serve ancora la risposta.

    Ogni volta che ti serve un informazione del tipo

    codice:
    Prodotto p = RecuperaDalDatabase("codiceProdotto");
    che comporterebbe un ovvio sovraccarico se la stessa info serve a piu componenti nell'ambito della stessa richiesta http puoi utilizzare il pattern seguente:

    codice:
    prodotto p = HttpContext.Current.Items["codiceProdotto"];
    if (null == p)
    {
        Prodotto p = RecuperaDalDatabase("codiceProdotto");
        HttpContext.Current.Items["codiceProdotto"];
    }
    In questo caso solo il componente che acederà per primo all'informazione la recupererà dal database e la conserverà in cache nella dictionary items, tutti gli altri accederanno all'informazione dalla cache.
    Come ho detto su puoi mettere tutta questa logica brutta da vedere in una classe adhoc.
    Ciao!

  5. #5
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    Correggo un po' visto che nn posso piu edtare:
    Quando recuperi va fatto il casting e poi mancava l'assegnazione all'ultima istruzione.

    codice:
    Prodotto p = (Prodotto)HttpContext.Current.Items["codiceProdotto"];
    if (null == p)
    {
        Prodotto p = RecuperaDalDatabase("codiceProdotto");
        HttpContext.Current.Items["codiceProdotto"] = p;
    }

  6. #6
    Grazie rsdpzed, prendendo spunto dalle tue osservazioni e studiandoci un po cerco di rispondermi per chiudere.

    il contenitore per ogni singola richiesta è:

    codice:
    HttpContext.Current.Items["paginaweb"] = value;
    e si può instanziare come sugerisce rsdpzed in questo modo:
    codice:
    if (HttpContext.Current.Items["myPaginaAttuale"] == null)
    {
        PaginaWeb p = (PaginaWeb)RecuperaDalDatabase("myPaginaAttuale");
        HttpContext.Current.Items["myPaginaAttuale"] = p;
    }
    dove inizializzarlo:
    in classi che estendono System.Web.UI.Page, System.Web.UI.MasterPage, System.Web.UI.UserControl

    Quando:
    questo è un po più difficile penso che il momento corretto sia sovrascrivere OnPreInit chiamando la funzione scritta sopra

    Sperando che sia tutto corretto (almeno a me funziona) e che sia il metodo migliore è tutto.
    Leonardo M.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.