2009-07-22 12 views
0

Comment éviter le dépassement?stringbuilder append remplacer mon enregistrement if (! IsPostback)

public partial class test : System.Web.UI.Page { 
    StringBuilder sb = new StringBuilder(); 

    protected void Page_Load(object sender, EventArgs e) 
    { 

     if (!IsPostBack) 
     { 
      sb.Append("one"); 
      lbl.Text = sb.ToString(); 
     } 

    } 
    protected void cmdSb_Click(object sender, EventArgs e) 
    { 


     sb.Append("two"); 
     lbl.Text = sb.ToString(); 

    } } 

Répondre

3

Rappelez-vous, chaque fois que vous faites tout postback, même si elle est juste pour gérer un événement, le cycle de vie de la page complète fonctionnera. Pour aider à comprendre cela, vous pouvez penser à votre code comme si tout cela était dans une grande fonction, plus comme ceci:

public partial class test : System.Web.UI.Page 
{ 
    // Page_Load runs for EVERYTHING 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     // -- Constructor Area 
     StringBuilder sb = new StringBuilder(); 

     // -- Page Init Area 

     // -- ViewSate is loaded 

     // -- Page Load Area 
     if (!IsPostBack) 
     { 
      sb.Append("one"); 
      lbl.Text = sb.ToString(); 
     } 

     // -- Validation controls are checked 

     // -- If valid, start handling events 

     // Handle your click event 
     if (cmdSb_Clicked) 
     { 
      sb.Append("two"); 
      lbl.Text = sb.ToString(); 
     } 


     // -- DataBinding Area 

     // -- Save ViewState   

     // -- Render Page: the class is turned into html that is sent to the browser 

     // -- Unload -- Page is disposed 

    } 
} 

Bien sûr, ce n'est pas ce qui se passe réellement, mais à partir de la pensée comme ça et vous êtes sur la bonne voie. Dans ce cas, notez que votre événement click ne s'exécutera jamais en même temps que votre code !IsPostBack, mais que vous utilisez un nouveau StringBuilder à chaque fois.

ici pour plus d'Vérifiez les informations sur le cycle de vie de la page:
http://msdn.microsoft.com/en-us/library/ms178472.aspx

+0

merci Joel pour une grande explication, mais je ne comprends toujours pas pourquoi dans l'exemple ci-dessous sb.Append ajouter une chaîne. Lorsque vous cliquez sur le bouton, la publication est déclenchée. Donc devrait se comporter comme précédemment. StringBuilder sb = new StringBuilder(); protected void Page_Load (expéditeur d'objet, EventArgs e) { sb.Append ("one"); lbl.Text = sb.ToString(); } protected void cmdSb_Click (expéditeur d'objet, EventArgs e) { sb.Append ("two"); lbl.Text = sb.ToString(); } –

+0

Vous ajoutez uniquement "un" au stringbuilder c'est _not_ un postback. Lorsque vous cliquez sur des événements, il s'agit d'une publication. Est-ce que vous voyez "onetwo" dans ce cas au lieu de simplement "deux", comme je m'y attendais? –

3

ASP.NET est apatride, ce qui signifie que votre instance de StringBuilder ne persistera pas à travers la publication automatique à moins que vous enregistrez quelque chose comme viewstate ou de l'état de la session.

+0

qui font sens. Merci –