ASP.Net, C # und Warn- / Anzeigenachrichten

75592
CptSupermrkt

Wir haben ein verstecktes Div in einer Masterseite. Wenn wir eine Nachricht anzeigen möchten, senden wir einer Funktion eine Nachricht, die angezeigt werden soll, und es wird das div von .Visible false auf .Visible true gesetzt und das Div mit der Nachricht gefüllt. In jeder Hinsicht funktioniert das und wir hatten wirklich keine Probleme damit. Ich habe einfach das Gefühl, dass es eine "Standardmethode" geben muss. Es gibt zwei Nachteile, auf die ich am Ende noch näher eingehen möchte, aber keine der Faktoren, die den Standort sprengen.

ControlHelper.cs

public static void DisplayNotificationMessage(MasterPage master, List<string> errormessages, string title, MessageBoxImages imgtype)
{
    if (master.FindControl("divmsgpanel") != null)
    {
        master.FindControl("divmsgpanel").Visible = true;
    }

    if (master.FindControl("divdimmer") != null)
    {
        master.FindControl("divdimmer").Visible = true;
    }


    Label titlelabel = (Label)master.FindControl("lblmsgpaneltitle");

    if (titlelabel != null)
    {
        titlelabel.Text = title;
    }

    TextBox thetxtbox = (TextBox)master.FindControl("txtboxmsgcontents");

    if (thetxtbox != null)
    {
        thetxtbox.Text = String.Empty;
        foreach (string x in errormessages)
        {
            thetxtbox.Text += x + "\n\n";
        }
    }

    Image icon = (Image)master.FindControl("imgmessageicon");

    switch (imgtype)
    {
        case MessageBoxImages.Info:
            icon.ImageUrl = "~/images/icons/ico-msginfo96x96.png";
            break;
        case MessageBoxImages.Warning:
            icon.ImageUrl = "~/images/icons/ico-msgwarning96x96.png";
            break;
        case MessageBoxImages.Error:
            icon.ImageUrl = "~/images/icons/ico-msgerror96x96.png";
            break;
        default:
            icon.ImageUrl = "~/images/icons/ico-msginfo96x96.png";
            break;
    }
}

divdimmer ist das, was wir verwenden, um den "Hintergrund" dunkel zu machen, sodass die Fehlermeldung für den Benutzer angezeigt wird. Hier ist ein kurzer Screenshot des Endprodukts:

Botschaft

Wie Sie sehen, wird der "Inhalt" der Site (die Seite, mit der der Benutzer interagiert) dunkel. Die Benachrichtigungsmeldung wird angezeigt.

Auf der Masterseite "schließt" die folgende Code-Behind-Methode das Meldungsfeld:

protected void btnmsgcloser_Click(object sender, EventArgs e)
{
    divmsgpanel.Visible = false;
    divdimmer.Visible = false;
}

Und dann können wir auf jeder Inhaltsseite die Methode aufrufen, um das Meldungsfeld mit dynamischem Inhalt sehr einfach anzuzeigen:

public void Save()
{
    List<string> errormessages = ValidateInput();

    if (errormessages.Count == 0)
    {
        //no error, do work
    }
    else
    {
        ControlHelper.DisplayNotificationMessage(Master.Master, errormessages, "Failure", MessageBoxImages.Error);
    }
}

Wie ich schon sagte, gibt es einen Nachteil. Eine der Designanforderungen bestand darin, nach erfolgreicher Übermittlung einer Seite auf eine andere Seite umzuleiten und eine Erfolgsmeldung anzuzeigen.

Beispielsweise haben wir eine Seite mit einem Kalender (calendar.aspx) und eine Seite für die Ereigniserstellung (addevent.aspx). Die Idee ist, dass, wenn Sie etwas über addevent.aspx absenden, Sie zu calendar.aspx umgeleitet werden und eine Meldung wie "Ereigniserstellung erfolgreich!"

Die einzige Möglichkeit, um herauszufinden, wie man eine Nachricht sowohl umleiten als auch anzeigen lässt, ist die Verwendung einer Abfragezeichenfolge. So haben wir zum Beispiel am Ende der Ereigniserstellung in addevent.aspx:

Response.Redirect("calendar.aspx?createsuccess=true");

Dann überprüfen wir im Code-behind für calendar.aspx auf PageLoad nach einer Querzeichenfolge und zeigen die entsprechende Meldung an:

protected void Page_Load(object sender, EventArgs e)
{
    if (Request.QueryString["deletesuccess"] == "true")
    {
        List<string> successmessage = new List<string>();
        successmessage.Add("The event has been deleted.");
        ControlHelper.DisplayNotificationMessage(Master.Master, successmessage, "Success", MessageBoxImages.Info);
    }
    else if (Request.QueryString["editsuccess"] == "true")
    {
        List<string> successmessage = new List<string>();
        successmessage.Add("The event has been edited.");
        ControlHelper.DisplayNotificationMessage(Master.Master, successmessage, "Success", MessageBoxImages.Info);
    }
    else if (Request.QueryString["createsuccess"] == "true")
    {
        List<string> successmessage = new List<string>();
        successmessage.Add("The event has been created.");
        ControlHelper.DisplayNotificationMessage(Master.Master, successmessage, "Success", MessageBoxImages.Info);
    }
}

Wieder funktioniert das. Aber es hat zwei Nachteile:

1) es teilt den zugehörigen Code zwischen zwei Speicherorten auf (wir senden den Code von addevent.aspx und heben ihn dann über die Abfragezeichenfolge in calendar.aspx auf)

2) Da der Abfragestring Teil der URL ist, wird beim erneuten Laden der Seite jedes Mal dieselbe Nachricht angezeigt. Angenommen, wir haben einen Benutzer, der Folgendes tut:

  • besucht calendar.aspx
  • klickt auf die Schaltfläche "Ereignis hinzufügen" und wird zu addevent.aspx weitergeleitet
  • Sendet ein neues Ereignis in addevent.aspx
  • wird zurück zu calendar.aspx zurückgeleitet? createuccess = true
  • Der Benutzer denkt, "Hey, das ist ziemlich praktisch, ich werde diese Seite mit einem Lesezeichen versehen."
  • Sie haben gerade "calendar.aspx? createduccess = true" mit einem Lesezeichen versehen. Daher erhalten sie jedes Mal, wenn sie das Lesezeichen öffnen, ein "Ereignis wurde erstellt". Botschaft.

Ich würde unsere Anforderungen / Bedürfnisse / Ziele aufführen, aber wir sind eigentlich ziemlich flexibel, solange wir ein Spaghetti-Code-Monster vermeiden können. Wir haben vorher mit Jquery herumgespielt. Ich habe wahrscheinlich etwas falsch gemacht, aber es fiel mir nicht leicht, einen dynamischen Inhalt von Message / Alert Box aus dem Code-Behind zu übergeben. Ich erinnere mich vage, dass ich zu Beginn des Projekts etwas in Betrieb genommen hatte, aber es war ein riesiges Durcheinander zwischen versteckten Elementen auf der ASPX-Seite, CodeBehind und Javascript. Es schien übermäßig wortreich und nicht sehr einfach zu warten. Aus diesem Grund haben wir eine eigene Lösung entwickelt (siehe oben), bei der wir eine zentrale Methode für die gesamte Site verwenden.

Antworten
7

1 Antwort auf die Frage

5
dreza

Nicht wirklich 100% sicher, ob dies für Sie funktioniert, aber könnten Sie Session-Variablen verwenden, um das zu erreichen, wonach Sie suchen?

    public sealed class MessageInfo
    {
        private readonly string title;

        private readonly string text;

        public MessageInfo(string title, string text)
        {
            this.title = title;
            this.text = text;
        }

        public string Title
        {
            get
            {
                return this.title;
            }
        }

        public string Text
        {
            get
            {
                return this.text;
            }
        }
    }

    public sealed class MessageBox
    {
        private readonly Page parent;

        public MessageBox(Page parent)
        {
            if (parent == null)
            {
                throw new ArgumentNullException("parent");
            }

            this.parent = parent;
        }

        private MessageInfo Message
        {
            get
            {
                return this.parent.Session["MessageBox"] as MessageInfo;
            }

            set
            {
                this.parent.Session["MessageBox"] = value;
            }
        }

        public void NextMessage(string title, string message)
        {
            NextMessage(new MessageInfo(title, message));
        }

        public void NextMessage(MessageInfo msgInfo)
        {
            Message = msgInfo;
        }

        private void Clear()
        {
            NextMessage(null);
        }

        public bool CanShow()
        {
            return !string.IsNullOrEmpty(Message.Text);
        }

        public void Show()
        {
            if (!CanShow())
            {
                return; // do nothing or perhaps throw exception?
            }

            ControlHelper.DisplayNotificationMessage(this.parent.Master.Master, Message.Text, Message.Title, MessageBoxImages.Info);
        }

        public void ShowOnce()
        {
            Show();

            // clear immediately
            Clear();
        }
    }

und in Ihrer Zielseite verwendet wie:

protected void Page_Load(object sender, EventArgs e)
{
   var msgBox = new MessageBox(this);
   if(msgBox.CanShow())
   {
      msgBox.ShowOnce();
   }
}

und von Ihrer aufrufenden Seite wie folgt einstellen:

protected void Deleted(object sender, EventArgs e)
{
   new MessageBox(this).NextMessage("Success", "The event has been deleted");
}
Ich hoffe auf jeden Fall, dass sie sich an Ihre Absichten halten :) Jesse C. Slicer vor 7 Jahren 0
@ JesseC.Slicer ja definitiv! Ob meine Absicht in eine gute Richtung ging, ist eine andere Frage :) dreza vor 7 Jahren 0
Ich habe eine ähnliche Lösung für eine MVC-Site verwendet, wenn Sie zwischen den Ansichten einer Kasse wechseln. Das Verwenden von Sitzung bedeutet auch, dass die Nachricht zwischen den Seiten bestehen bleiben kann, bis der Benutzer sie abgewiesen hat. Einziger Wermutstropfen sind Situationen, in denen die Sitzung nicht verfügbar / nicht störend ist. Lazlow vor 7 Jahren 0
Bei Verwendung der Sitzung kann der Benutzer diese bestimmte Seite nicht auf zwei Registerkarten parallel verwenden. Dies ist ein Indikator für den Missbrauch von Sitzungen. usr vor 7 Jahren 1