C# 如果(!IsPostback),stringbuilder追加将覆盖我的记录

C# 如果(!IsPostback),stringbuilder追加将覆盖我的记录,c#,postback,stringbuilder,C#,Postback,Stringbuilder,如何避免覆盖 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.Tex

如何避免覆盖

 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();

    } }

ASP.NET是无状态的,这意味着您的StringBuilder实例不会在回发过程中保持不变,除非您将其保存为类似viewstate或session state的状态。

ASP.NET是无状态的,这意味着您的StringBuilder实例不会在回发过程中保持不变,除非您将其保存为类似viewstate或session state的状态。

请记住,每次回发时,即使只是为了处理事件,完整的页面生命周期也会运行。为了帮助理解这一点,您可以将代码想象成一个大函数,更像这样:

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

    }
}
当然,这并不是实际发生的事情,但开始这样想,你就走上了正确的道路。在这种情况下,请注意,单击事件将不会与
同时运行!IsPostBack
code,但您每次都在使用新的StringBuilder

有关页面生命周期的更多信息,请点击此处:

请记住,每次回发时,即使只是为了处理事件,完整的页面生命周期也会运行。为了帮助理解这一点,您可以将代码想象成一个大函数,更像这样:

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

    }
}
当然,这并不是实际发生的事情,但开始这样想,你就走上了正确的道路。在这种情况下,请注意,单击事件将不会与
同时运行!IsPostBack
code,但您每次都在使用新的StringBuilder

有关页面生命周期的更多信息,请点击此处:

感谢Joel的精彩解释,但我仍然不明白为什么在下面的示例中sb.Append添加字符串。单击按钮时,将触发回发。所以应该像以前一样。StringBuilder sb=新的StringBuilder();受保护的无效页面_Load(对象发送方,事件参数e){sb.Append(“一”);lbl.Text=sb.ToString()}受保护的无效cmdSb_Click(对象发送方,事件参数e){sb.Append(“两”);lbl.Text=sb.ToString();}您只追加“一”对于stringbuilder来说,这不是回发。单击事件激发时,这是回发。在这个例子中,你看到的是“onetwo”而不是我所期望的“two”吗?谢谢Joel的精彩解释,但是我仍然不明白为什么在下面的示例中sb.Append添加字符串。单击按钮时,将触发回发。所以应该像以前一样。StringBuilder sb=新的StringBuilder();受保护的无效页面_Load(对象发送方,事件参数e){sb.Append(“一”);lbl.Text=sb.ToString()}受保护的无效cmdSb_Click(对象发送方,事件参数e){sb.Append(“两”);lbl.Text=sb.ToString();}您只追加“一”对于stringbuilder来说,这不是回发。单击事件激发时,这是回发。在这种情况下,你看到的是“一个两个”,而不是我所期望的“两个”吗?