stringbuilder ajouter outrepasser mon dossier if (! IsPostBack)
-
19-09-2019 - |
Question
Comment éviter primordial?
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();
} }
La solution
Rappelez-vous, chaque fois que vous faites any postback, même si elle est juste pour gérer un événement, la pleine cycle de vie se déroulera. 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 ceci et vous êtes sur la bonne voie. Dans ce cas, notez que votre événement clic jamais exécuté en même temps que votre code !IsPostBack
, mais vous utilisez un nouveau StringBuilder chaque fois.
Vérifiez ici pour plus d'informations sur le cycle de vie de la page:
http://msdn.microsoft.com/en-us/library/ms178472. aspx
Autres conseils
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 état viewstate ou session.