2009-03-31 4 views
0

Ich habe eine Seite (Formular), die viele UserControls darauf hat, und ich versuche, eine einzige Schaltfläche zu haben, um alles zu speichern. Die UserControls sind tatsächlich verschachtelt, also wollte ich irgendwie jedem UC signalisieren, dass es sich selbst speichern sollte, anstatt alles irgendwie in ein Ereignis zu verpacken oder ein einzelnes Ereignis eine Kaskade von Speicherereignissen auslösen zu lassen.Ereignis nicht früh genug im .NET-Seitenzyklus

Mein Plan war, eine statische Klasse (Requisiten this answer für den Code) zu verwenden:

public static class RequestScopedFormData 
{ 
    private const string save_key = "request_form_is_saving"; 

    public static bool FormIsSaving 
    { 
     get 
     { 
      object o = HttpContext.Current.Items[save_key]; 
      return Convert.ToBoolean(o); 
     } 
     set 
     { 
      HttpContext.Current.Items[save_key] = value; 
     } 
    } 
} 

Idealfall eine Taste auf meinem Master würde gesetzt RequestScopedFormData.FormIsSaving = true, und als .NET baut die Seite und seine Benutzersteuerelemente würden sie selbst speichern können.

Das Problem, das ich habe, ist, dass ich ein Ereignis nicht früh genug in den Seitenlebenszyklus auslösen kann, um die Benutzersteuerelemente zu speichern. Selbst wenn ich den Sicherungscode in das PreRender-Ereignis verschiebe und den ImageButton in die Seite selbst verschiebe (anstelle der MasterPage), kann ich die FormIsSaving-Einstellung vor der UC-Sicherungsprüfung nicht auf "True" setzen.

Es passiert etwas wie folgt aus:

  • Seite Page_Load
  • Master Page_Load
  • UC Page_Loads und PreRenders (sie gemischt werden, es prerenders einige vor es andere lädt)
  • Master SaveButton_Click Ereignis (das ist, wo ich meine Klasse Variable einstellen)
  • Master PreRender
  • Seite PreRender

So leider die SaveButton_Click Methode geschieht, nachdem der UCs geladen werden, so dass sie sparen nie.

Antwort

1

Sie können auch überprüfen, ob Postbacks durch die Taste speichern verursacht wurde:

Request.Form["__EVENTTARGET"].Contains({YourSaveButton}.UniqueID) 

Die Formularvariablen zur Verfügung stehen früher im Lebenszyklus Seite.

+0

Dies ist definitiv, was ich gesucht habe ... außer dass mein __EVENTTARGET scheint leer zu sein. Wenn ich cks Trace = true-Vorschlag verwende, sehe ich die UniqueID nirgends in der Anfrage. –

+1

Offenbar Schaltflächen legen das __EVENTTARGET nicht fest. http://ryanfarley.com/blog/archive/2005/03/11/1886.aspx für eine Problemumgehung. –

3

Ändern Sie Ihre @Page-Anweisung, um Trace = "true" einzuschließen. Dies gibt Ihnen eine vollständige Diagnose darüber, was aufgerufen wird, und ermöglicht es Ihnen, die beste Methode für den von Ihnen benötigten Teil des Lebenszyklus zu ermitteln.

+0

Geben Sie einen Kommentar mit welchem ​​Ereignis Sie brauchen, und ich werde die Antwort so ändern, dass es alle Informationen enthält. – cjk

+0

Das Problem ist, dass ich nicht scheinen kann, diese Variable vor dem UC____Loads zu setzen. Wenn ich ein ImageButton -Ereignis verwende, um es zu setzen, kommt es nach allen UC Page_Loads (und PreRenders). Gibt es eine Möglichkeit zu wissen, welche Methode/welches Ereignis die Anfrage/Antwort verursacht hat? –

+0

Obwohl Sie es nicht tun möchten, könnte die Ereigniskaskade der beste Weg sein, dies zu tun, es macht Sinn, auch wenn es ein Schmerz ist zu schreiben – cjk

0

Sind Ihre Steuerelemente alle von derselben Schnittstelle abgeleitet, oder können Sie ihnen eine gemeinsame Schnittstelle hinzufügen?

Dann können Sie in Ihrer Methode "save button" alle Steuerelemente auf Ihrer Seite durchlaufen und dann für die Elemente, die Ihrer Schnittstelle entsprechen, die Methode Save aufrufen.

z.

foreach (Control cntrl in Page.Controls) 
{ 
    if (cntrl is IMySavableControl) 
    { 
    cntrl.Save(); 
    } 
} 
+0

Nicht sicher, ob das funktioniert oder nicht, aber das ist eine gute Idee - nochmals vielen Dank. –

Verwandte Themen