stringbuilder append substituir o meu recorde if (! IsPostback)
-
19-09-2019 - |
Pergunta
Como evitar a substituição?
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();
} }
Solução
Lembre-se, cada vez que você qualquer postback, mesmo que seja apenas para lidar com um evento, o completo ciclo de vida da página será executado. Para ajudar a entender isso, você pode pensar em seu código como se fosse tudo em uma função de grande, mais como esta:
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
}
}
Claro que isso não é o que realmente acontece, mas a partir de pensar nisso como este e você está no caminho certo. Neste caso, nota que o seu evento de clique nunca funcionará ao mesmo tempo como o seu Código !IsPostBack
, mas você está usando um novo StringBuilder de cada vez.
Confira aqui mais informações sobre o ciclo de vida de página:
http://msdn.microsoft.com/en-us/library/ms178472. aspx
Outras dicas
ASP.NET é apátrida, o que significa que sua instância StringBuilder não irá persistir através do PostBack a menos que você salve-o em algo como viewstate ou sessão estado.