Avatar billede stinejh1980 Nybegynder
05. oktober 2007 - 09:13 Der er 9 kommentarer og
1 løsning

Pop-up med meddelelse om opdatering

Jeg koder i ASP.NET 2.0 og VB 2.0.

Jeg har lavet et online prisgivning - og ordreprogram til eksterne sælgere.

Jeg vil gerne høre om der er noget som har lavet en funktion som beder alle brugere logge af inden for et bestemt tidsrum så systemet kan blive opdateret/vedligeholdt. Denne funktion skal være synlig/poppe op ligegyldig hvilken side de er på.

Jeg bruger fortiden Access database, men forventer at skifte til SQL inden for kort tid.
Avatar billede innercitydk Nybegynder
05. oktober 2007 - 09:50 #1
Jeg ville opbygge sitet med masterpage, og så ligge logikken til pop-up meddelelse i masterpagens code behind fil.

Du kan eventuelt bruge følgende messagbox kode. Lig koden i en fil der hedder MessageBox.cs i App_Code folderen i webroden. Efterfølgende kan du kalde den overalt fra med MessageBox.Show(String);

using System;
using System.Data;
using System.Collections;
using System.Text;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

/// <summary>
/// Summary description for MessageBox
/// </summary>
public class MessageBox
{
    private static Hashtable m_executingPages = new Hashtable();
    private MessageBox() { }
    public static void Show(string sMessage)
    {
        // If this is the first time a page has called this method then
        if (!m_executingPages.Contains(HttpContext.Current.Handler))
        {
            // Attempt to cast HttpHandler as a Page.
            Page executingPage = HttpContext.Current.Handler as Page;
            if (executingPage != null)
            {
                // Create a Queue to hold one or more messages.
                Queue messageQueue = new Queue();
                // Add our message to the Queue
                messageQueue.Enqueue(sMessage);
                // Add our message queue to the hash table. Use our page reference
                // (IHttpHandler) as the key.
                m_executingPages.Add(HttpContext.Current.Handler, messageQueue);
                // Wire up Unload event so that we can inject
                // some JavaScript for the alerts.
                executingPage.Unload += new EventHandler(ExecutingPage_Unload);
            }
        }
        else
        {
            // If were here then the method has allready been
            // called from the executing Page.
            // We have allready created a message queue and stored a
            // reference to it in our hastable.
            Queue queue = (Queue)m_executingPages[HttpContext.Current.Handler];
            // Add our message to the Queue
            queue.Enqueue(sMessage);
        }
    }

    // Our page has finished rendering so lets output the
    // JavaScript to produce the alert's
    private static void ExecutingPage_Unload(object sender, EventArgs e)
    {
        // Get our message queue from the hashtable
        Queue queue = (Queue)m_executingPages[HttpContext.Current.Handler];
        if (queue != null)
        {
            StringBuilder sb = new StringBuilder();
            // How many messages have been registered?
            int iMsgCount = queue.Count;
            // Use StringBuilder to build up our client slide JavaScript.
            sb.Append("<script language='javascript'>");
            // Loop round registered messages
            string sMsg;
            while (iMsgCount-- > 0)
            {
                sMsg = (string)queue.Dequeue();
                sMsg = sMsg.Replace("\n", "\\n");
                sMsg = sMsg.Replace("\"", "'");
                sb.Append(@"alert( """ + sMsg + @""" );");
            }
            // Close our JS
            sb.Append(@"</script>");
            // Were done, so remove our page reference from the hashtable
            m_executingPages.Remove(HttpContext.Current.Handler);
            // Write the JavaScript to the end of the response stream.
            HttpContext.Current.Response.Write(sb.ToString());
        }
    }
}


Vh Nicki
Avatar billede stinejh1980 Nybegynder
05. oktober 2007 - 10:16 #2
Jeg har aldrig brugt masterpages.
Hvordan fungere det i praksis?
Jeg bruger VS2005.

Funktionen skal aktiveres når jeg vil og ikke når brugeren udfører en handling.
Avatar billede innercitydk Nybegynder
05. oktober 2007 - 12:58 #3
Det fungerer i praksis sådan at man opretter en masterpage. Denne har et content område hvor alle subpages vises. Hvis man derfor har designrettelser til et site ændres disse på masterpagen og slår derved gennem på alle subpages da disse jo implementerer masterpagen. Når man opretter en almindelig side kan man vælge en tilhørende masterpage. I masterpagen plejer jeg at ligge menu osv. Selve masterpagen har et form tag udenom content området. Dine undersider skal derfor ikke have et form tag, men bare controls. Disse ligger så automatisk i masterpagens form tag.

Her er en fin tutorial der beskriver konceptet:

http://www.dotnetjunkies.com/Tutorial/F85F2F5D-BB2C-4ADF-9386-1943078D83F1.dcik

Angående funktionen ville jeg lave en db record med beskeden, og hvilken periode den skal vises. Samtidig ville jeg så lave en tabel med alle brugerne og et flag (true/false) der beskriver om brugeren har set beskeden. Afhængig af dette flag og indstillingerne i besked recorden vises den eller ej.

Vh
Avatar billede jhe-ting Nybegynder
05. oktober 2007 - 12:59 #4
Jeg tror du skal ud i noget AJAX, så klienten kan modtage signal fra serveren. Det vil dog stadigt være klienten der spørger, via en HTTPRequest.
Avatar billede innercitydk Nybegynder
05. oktober 2007 - 13:01 #5
Samtidig ville jeg disable login i perioden hvor siden vedligeholdes. Alternativt til messageboksen smider du en besked ud i en label eller lignende på masterpagen. Brugeren kan så eksempelvis trykke på Læs hvorefter beskeden ikke vises igen efter reload. Samme princip som her på E når der er en generel besked i toppen.
Avatar billede innercitydk Nybegynder
05. oktober 2007 - 13:02 #6
Ajax kan sagtens bruges, men er absolut ikke nødvendig. Det burde være dækkende at vise beskeden når brugeren navigerer på siden (og den reloades).
Avatar billede stinejh1980 Nybegynder
11. oktober 2007 - 12:10 #7
Jeg har nu oversat det til VB.

Men jeg har stadig ikke fundet ud af hvornår funktionen aktiveres.

Det blev nogenlunde sådan her:
    Public Class MessageBox
        Dim m_executingPages As Hashtable

        Sub Show(ByVal sMessage As String)
            ' If this is the first time a page has called this method then
            m_executingPages = New Hashtable

            If Not m_executingPages.Contains(HttpContext.Current.Handler) Then
                ' Attempt to cast HttpHandler as a Page.
                Dim executingPage As Page = TryCast(HttpContext.Current.Handler, Page)
                If executingPage IsNot Nothing Then
                    ' Create a Queue to hold one or more messages.
                    Dim messageQueue As New Queue()
                    ' Add our message to the Queue
                    messageQueue.Enqueue(sMessage)
                    ' Add our message queue to the hash table. Use our page reference
                    ' (IHttpHandler) as the key.
                    m_executingPages.Add(HttpContext.Current.Handler, messageQueue)
                    ' Wire up Unload event so that we can inject
                    ' some JavaScript for the alerts.
                    AddHandler executingPage.Unload, AddressOf ExecutingPage_Unload
                End If
            Else
                ' If were here then the method has allready been
                ' called from the executing Page.
                ' We have allready created a message queue and stored a
                ' reference to it in our hastable.
                Dim queue As Queue = DirectCast(m_executingPages(HttpContext.Current.Handler), Queue)
                ' Add our message to the Queue
                queue.Enqueue(sMessage)
            End If
        End Sub

        ' Our page has finished rendering so lets output the
        ' JavaScript to produce the alert's
        Sub ExecutingPage_Unload(ByVal sender As Object, ByVal e As EventArgs)
            ' Get our message queue from the hashtable
            Dim queue As Queue = DirectCast(m_executingPages(HttpContext.Current.Handler), Queue)
            If queue IsNot Nothing Then
                Dim sb As New StringBuilder()
                ' How many messages have been registered?
                Dim iMsgCount As Integer = queue.Count
                ' Use StringBuilder to build up our client slide JavaScript.
                sb.Append("<script language='javascript'>")
                ' Loop round registered messages
                Dim sMsg As String
                While System.Math.Max(System.Threading.Interlocked.Decrement(iMsgCount), iMsgCount + 1) > 0
                    sMsg = DirectCast(queue.Dequeue(), String)
                    sMsg = sMsg.Replace("" & Chr(10) & "", "\n")
                    sMsg = sMsg.Replace("""", "'")
                    sb.Append("alert( """ + sMsg + """ );")
                End While
                ' Close our JS
                sb.Append("</script>")
                ' Were done, so remove our page reference from the hashtable
                m_executingPages.Remove(HttpContext.Current.Handler)
                ' Write the JavaScript to the end of the response stream.
                HttpContext.Current.Response.Write(sb.ToString())
            End If
        End Sub
    End Class
Avatar billede stinejh1980 Nybegynder
11. oktober 2007 - 13:23 #8
Nu er jeg kommet lidt videre, men jeg får fejlen:
Object reference not set to an instance of an object.

på følgende linie:
sMsg = sMsg.Replace("" & Chr(10) & "", "\n")

Hvis jeg nøjes med at skrive:
  While System.Math.Max(System.Threading.Interlocked.Decrement(iMsgCount), iMsgCount + 1) > 0
                    sMsg = DirectCast(queue.Dequeue(), String)
                    'sMsg = sMsg.Replace("" & Chr(10) & "", "\n")
                    'sMsg = sMsg.Replace("""", "'")
                    sb.Append("alert( """ + sMsg + """ );")
                End While

Får jeg en pop up meddelselse uden text når siden unloader, men jeg vil have den skal komme når jeg bestemmer det. F.eks hvis administrator trykker på en knap.

Og det er ikke sikkert at det er den smme tekst hver gang.

Nogle gange skal fejlmeddelselsen måske sige:
Du bedes logge af hurtigst mulig - systemet skal opdateres.

Andre gange:
Systemet vil være nede i aften mellem 19 og 20 p.g.a. vedligeholdelse.
Avatar billede stinejh1980 Nybegynder
13. november 2007 - 08:29 #9
Så er jeg blvet ekspert i det med master pages.

Jeg prøver lige din funktion senere.
Avatar billede stinejh1980 Nybegynder
07. maj 2008 - 09:01 #10
Nu har jeg endelig prøvet det af og det virkede ikke.

Jeg har derfor lagt en meddelselse op på sitet at hver søndag mellem 08:00 og 13:00 må systemet ikke bruges.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester