【问题标题】:stringbuilder append override my record if (!IsPostback)stringbuilder append 覆盖我的记录 if (!IsPostback)
【发布时间】:2009-07-22 22:22:54
【问题描述】:

如何避免覆盖?

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

    } }

【问题讨论】:

    标签: c# postback stringbuilder


    【解决方案1】:

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

    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 代码同时运行,但您每次都使用新的 StringBuilder。

    在此处查看有关页面生命周期的更多信息:
    http://msdn.microsoft.com/en-us/library/ms178472.aspx

    【讨论】:

    • 感谢 Joel 的精彩解释,但我仍然不明白为什么在下面的示例中 sb.Append 添加字符串。单击按钮时,会触发回发。所以应该表现得像以前一样。 StringBuilder sb = new StringBuilder(); protected void Page_Load(object sender, EventArgs e) { sb.Append("one"); lbl.Text = sb.ToString(); } protected void cmdSb_Click(object sender, EventArgs e) { sb.Append("two"); lbl.Text = sb.ToString(); }
    • 您只将“一个”附加到字符串构建器,它不是回发。当您触发点击事件时,它回发。在这种情况下,您看到的是“onetwo”而不是我所期望的“two”吗?
    【解决方案2】:

    ASP.NET 是无状态的,这意味着您的 StringBuilder 实例不会通过 PostBack 持续存在,除非您将其保存到视图状态或会话状态之类的东西。

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      相关资源
      最近更新 更多