2009-02-28 3 views
1

Grundsätzlich habe ich eine Dropdown-Liste und ein dynamisch hinzugefügtes Benutzersteuerelement. Das Benutzersteuerelement lädt eine Rasteransicht abhängig von der Auswahl, die in der Dropdown-Liste getroffen wurde. Die Dropdown-Liste ist nicht Teil des Benutzersteuerelements.ViewState, UserControl und IsPostback

Jetzt ist die Frage, wie simuliere ich (isControlPostback = false) jedes Mal, wenn der Benutzer die Auswahl in der Dropdown-Liste ändert? Anscheinend erinnert sich ViewState an das Steuerelement.

In meinem Benutzerkontrolle ich habe:

protected bool IsUserControlPostBack 
{ 
    get 
    { 
     return this.ViewState["IsUserControlPostBack"] != null; 
    } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsUserControlPostBack) 
    { 
     ViewState.Add("IsUserControlPostBack", true); 
     //load stuff in the grid view and bind it 
    } 
} 

Wenn der Benutzer die Auswahl auf der Dropdown-Liste ändert sich, ich habe ein Javascript bestätigen Feld und die Seiten Beiträge zurück. So OnSelectedIndexChanged Ereignis für die Dropdown-Liste wird nicht ausgelöst. Ich möchte entfernen, um so etwas jedes Mal zu tun, wenn sich der ausgewählte Index ändert: ViewState.Remove ("IsUserControlPostBack");

+0

Ich habe gerade herausgefunden, dass das OnLoad-Ereignis des Steuerelements direkt nach dem OnLoad-Ereignis der Seite ausgeführt wird, und VOR anderen Ereignissen in der Dropdown-Liste. Im Grunde lade ich das Benutzersteuerelement, bevor Page reagiert auf Änderungen, die von der Dropdown-Liste ausgelöst werden. Dieses Verhalten ist im Wesentlichen das Problem. – sarsnake

Antwort

0

Für alle, die daran interessiert sind, die Antwort zu wissen: endete ich eine öffentliche Eigenschaft innerhalb Benutzerkontrolle Implementierung und laden Sie das Steuerelement im Server Dropdown-Liste SelectedIndexChanged Ereignis statt OnInit. Dies machte die explizite Verwendung von Viewstate überflüssig.

0

Fügen Sie das Steuerelement irgendwann vor OnLoad hinzu. Z.B. OnInit. Zwischen OnInit und OnLoad wird das Viewstate geladen und Postback-Ereignisse werden ausgeführt.

+0

es ist bereits in OnInit – sarsnake

1

Sie können im Prerender-Ereignis Änderungen am Steuerelement vornehmen. Wenn dieses Ereignis ausgelöst wird, werden alle anderen Aktionen ausgeführt. Oder Sie können öffentliche Eigenschaft in der Benutzersteuerung und bei der Einstellung erforderlichen Wert reagieren auf angemessen.

1

Der ViewState, auf den Sie in Ihrem Benutzersteuerelement zugreifen, ist nicht derselbe, auf den Sie auf der Seite zugreifen. Wenn Sie Ihre Seite für die Kommunikation mit Ihrem Benutzersteuerelement benötigen, empfehle ich Ihnen, zu diesem Zweck eine öffentliche Methode für Ihr Benutzersteuerelement hinzuzufügen.

Wenn aus irgendeinem Grund bevorzugen Sie etwas ähnlich wie Ihre Viewstate Ansatz, Sie Context.Items versuchen. Beachten Sie, dass Context.Items zwischen den Anforderungen nicht beibehalten wird.

+0

hinzugefügt, wenn ich ein Steuerelement auf einer Seite laden, mache ich etwas wie Control Control = Load ("controlname.ascx"); Hätte die Kontrolle Zugriff auf die öffentlichen Methoden? Die Sache ist, dass ich nicht will, dass das Steuerelement jedes Mal aktualisiert wird, wenn ich es lade - aber nur wenn sich die Dropdown-Liste ändert. – sarsnake

+0

Viewstate auf der Seite unterscheidet sich von Viewstate auf dem Steuerelement? Das ist neu für mich. Haben Sie einen MSDN-Link, der das erklärt? Ist es nicht der Sinn von Viewstate, alles an einem Ort zu halten? Völlig verwirrt. – sarsnake

+0

Die Daten des Viewstates werden alle in einem großen Chunk serialisiert, der auf der Seite gespeichert wird. Die Daten sind jedoch als Verzweigungen in einem Baum organisiert, wobei jedes Steuerelement seinen eigenen Zweig erhält. ViewState dient jedoch nicht dazu, den Status zwischen Steuerelementen zu teilen. –