Domanda

Mi scuso in anticipo per la pubblicazione di un così lungo domanda. Che ci crediate o no, quello che vedete qui rappresenta in realtà una versione abbastanza condensata del problema / code a portata di mano. E mentre Gradirei qualsiasi puntatori a un approccio migliore o diverso, vorrei anche piacerebbe molto ottenere il fondo di questo modo che io possa dormire la notte:)

mi sono imbattuto in un obbligo di trasmettere messaggi di conferma tra le pagine aspx distinte. Ho optato di non utilizzare una variabile stringa di query in quanto i valori di stringa di query "sono" sticky (vale a dire che persistono su tutti i postback successivi) e io non vogliono trattare con l'aggiunta di un po 'di logica condizionale intorno a questo.

In ogni caso, mi si avvicinò con un semplice classe che utilizza Session per associare le notifiche con URL specifici. Ho poi agganciato la mia pagina master Load evento per interrogare questa classe per le notifiche che devono essere visualizzati per l'URL corrente. Se ne trova una, si carica dinamicamente un controllo utente NotificationMessage e visualizza il contenuto del messaggio.

Tutto funziona come previsto quando si cerca di passare tra le diverse notifiche pagine aspx. Com'era prevedibile, le cose non funzionano quando una pagina di contenuto tenta di aggiungere una notifica a se stesso (vale a dire "I dati che hai inserito non è valido, riprovare"). Il motivo è abbastanza chiaro: per il momento in una pagina di contenuti aggiunge una notifica per sé, la Load evento della pagina master ha già sparato, quindi è troppo tardi nel ciclo di vita pagina di fare nulla di buono. Il codice in questione è incollato sotto.

    public class MyMasterPage:MasterPage{

    protected void Page_Load(object sender, EventArgs e)
    {
        LoadNotifications(this.Request.Url.ToString());
    }


    private void LoadNotifications(string url)
    {
        //look for a notification
        Notification? notification = NotificationManager.Instance.RetrieveNotification(url);

        //there are no notifications, nothing to see here 
        if (!notification.HasValue)
        {
            return;
        }

        //there is a Notification for this url, so load it into a user control
        NotificationMessage notificationMessageControl = (NotificationMessage)LoadControl("~/App_UserControls/NotificationMessage.ascx");
        notificationMessageControl.ID = "notificationMessage";
        notificationMessageControl.Notification = notification;
        notificationMessageControl.Visible = true;

        //find the placeholder on the master page
        PlaceHolder placeHolder = (PlaceHolder)PageUtils.FindControlRecursive(this, "NotificationPlaceholder");

        if (placeHolder == null)
        {
            throw new ApplicationException("NotificationPlaceholder control not found.");
        }

        //insert into control
        placeHolder.Controls.Add(notificationMessageControl);
        placeHolder.Visible = true;

        //remove the notification so it doesn't show up next time
        NotificationManager.Instance.RemoveNotification(url);


    }

}

Dati i cicli di vita emessi accennato sopra, ho modificato la classe NotificationManager in modo che solleva un evento ogni volta che una notifica è stata aggiunta per la pagina corrente. La pagina master intercettazioni tal caso, e se il Load ha già sparato, si prende il via il metodo LoadNotifications tutto da capo.

 //bind the event on the page constructor
    public MyMasterPage()
    {
        NotificationManager.Instance.NotificationAdded += this.NotificationAdded;

    }

    private void NotificationAdded(string forUrl)
    {
        if (_pageLoaded){
           LoadNotifications(forUrl);
        }
    }

Purtroppo, questo non funziona. Ho fatto un passo attraverso questo codice numerose volte, e nonostante il fatto che la pagina master carica il NotificationMessage UserControl e lo aggiunge al segnaposto appropriata senza incidenti, il codice HTML aspx finale non include il markup per questo UserControl. Ho messo i punti di interruzione all'interno del Load del UserControl e verificato che sono effettivamente essere colpiti durante l'esecuzione.

Se carico dinamicamente l'UserControl dall'interno della pagina di contenuto e bypassare la pagina di Maestro del tutto, rende senza un intoppo:

public partial class MyContentPage:Page
{

    public void DoSomethingCool(object sender, EventArgs e)
    {
        if (MyServiceLayer.Save(foo)==false){
            Notification notification = new Notification(NotificationType.Error, "We’re sorry, your document was not saved.");
            NotificationMessage notificationMessage = (NotificationMessage)LoadControl("~/App_UserControls/NotificationMessage.ascx");
            notificationMessage.Notification = notification;
            notificationMessage.Visible = true;
            PlaceHolder holder = (PlaceHolder)PageUtils.FindControlRecursive(this, "NotificationPlaceholder");
            holder.Controls.Add(notificationMessage);
        }
    }
}

Per la cronaca, ho spogliato il caricamento dinamico di UserControl, optando per una dichiarazione statica nella pagina master markup e un comando basato codice della proprietà Visible del controllo; ancora niente da fare!

Se qualcuno potesse far luce su questo enigma, sarei molto obbligato.

È stato utile?

Soluzione

Ho provato questo genere di cose prima e non sono mai stato pienamente bene con esso. Quello che ho fatto, invece, è stato messo il mio ASCX in ogni pagina (o sul masterpage), e lasciare che il controllo ASCX suo stato, piuttosto che lasciare che l'ASPX controllare il mio ASCX.

Non sono sicuro che questo aiuterà per la vostra situazione, però.

Altri suggerimenti

Sembra che si desidera che le informazioni per mostrare dopo il vostro eventi di controllo del fuoco. Si potrebbe prendere in considerazione lasciando che quei messaggi aggregano fino a quando tutti gli eventi di controllo hanno sparato e poi tirare fuori tutti i messaggi dal NotificationManager in OnPreRender, piuttosto che Page_Load. In questo modo si può sbarazzarsi degli eventi (come NotificationAdded), ecc che sono probabilmente A complicare le cose.

Non è al 100% quale sia il problema, però. A volte aiuta a sapere che il MasterPage è in realtà un controllo sulla pagina, piuttosto che il contrario, come si potrebbe pensare. E 'intenzione di essere soggetti alle limitazioni alcun controllo avrebbe in una pagina.

HTH, Anderson

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top