none
请教一个关于asp.net 生命周期的问题 RRS feed

  • 问题

  •   protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    this.DropDownList1.DataSource = DAL.UnitInfo.GetData();
                    this.DropDownList1.DataTextField = "UnitName";
                    this.DropDownList1.DataValueField = "id";
                    this.DropDownList1.DataBind();
                    this.DropDownList1.Items.Insert(0, new ListItem("全部", "101"));
    
                    DateTime weekStart = DateTime.Now.AddDays(-(int)(DateTime.Now.DayOfWeek) - 2);
                    DateTime weekEnd = weekStart.AddDays(7);
                    this.TextBox1.Text = weekStart.ToShortDateString();
                    this.TextBox2.Text = weekEnd.ToShortDateString();
                   setFilterExpression();//放到这里可以正确查询button
                } 
                //setFilterExpression();如果该方法放到这里,button执行提交后,无法正确查询
                ApplyFilterExpression();
            }
    
            #region 查询与筛选操作
            private void setFilterExpression()
            {
                var sbFilter = new System.Text.StringBuilder(1000);
    
                if (this.DropDownList1.SelectedIndex != 0)
                {
                    sbFilter.Append("UnitID='").Append(this.DropDownList1.SelectedValue).Append("'");
                }
    
                if (this.TextBox1.Text.Trim().Length > 0)
                {
                    if (sbFilter.Length != 0)
                    {
                        sbFilter.Append(" AND ");
                    }
                    sbFilter.Append("sbsj >='").Append(this.TextBox1.Text.Trim()).Append("'");
                }
    
                if (this.TextBox2.Text.Trim().Length > 0)
                {
                    if (sbFilter.Length != 0)
                    {
                        sbFilter.Append(" AND ");
                    }
                    sbFilter.Append("sbsj <='").Append(this.TextBox2.Text.Trim()).Append("'");
                }
                
                ViewState["filter"] = sbFilter.ToString();
            }
            private void ApplyFilterExpression()
            {
                //this.Literal3.Text = "";
                string filter = Convert.ToString(ViewState["filter"]);
    
                //this.Literal3.Text = filter;
                if (filter.Length != 0)
                {
                    this.ObjectDataSource1.FilterExpression = filter.ToString();
                }
                else
                {
                    this.ObjectDataSource1.FilterExpression = null;
                }
            }
    
            #endregion
    
            protected void Button1_Click(object sender, EventArgs e)
            {
                setFilterExpression();
                ApplyFilterExpression();
    
                //Response.Write(ViewState["filter"]);
                //Response.Write("aaa");
            }
    
    就是设置查询条件的viewstate所放置的位置不同,导致结果有问题,百思不得其解,请问是哪个环节有问题呢?详细请看代码中的注释
    • 已移动 Caillen 2015年3月18日 8:47
    2015年3月18日 7:44

全部回复

  • 您好,

    首先你需要了解asp.net 的页面生存周期,请参考下面文章:
    http://www.cnblogs.com/xhwy/archive/2012/05/20/2510178.html

    第二呢,我建议你先调试下你的代码,看看ViewState["filter"]值得变化。

    第三,我建议您使用Session["xx"]去保存变量的值,减少页面负担

    2015年3月22日 11:23
  • 这些我都看过,viewstate也试过,没找到问题
    2015年3月23日 1:00
  • protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { ...

    setFilterExpression();//放到这里可以正确查询button } //setFilterExpression();如果该方法放到这里,button执行提交后,无法正确查询 ApplyFilterExpression(); } #region 查询与筛选操作 private void setFilterExpression() { ...

    } private void ApplyFilterExpression() { ...

    } #endregion protected void Button1_Click(object sender, EventArgs e) { setFilterExpression(); ApplyFilterExpression(); }

    Web會先跑 Page.Load,後才到 Control的event (就是你這裡的Button.Click)。

    如果你把setFilterExpression()放進(!IsPostBack)裡面,那第一次會跑所有的Page.Load裡面的code。

    跟著End User 按一下Button,Page.Load會跑,但(!IsPostBack){...}裡面的不會跑,DropDownList裡面應該會沒東西,而code就只跑了Page.Load裡的ApplyFilterExpression,再跑Button1_Click的 setFilterExpression和ApplyFilterExpression。

    你原本想的logic是怎樣的?


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    請記得將對您有幫助的回覆標示為解答以幫助其他尋找解答及參與社群討論的朋友們。
    Please remember to clickMark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.

    2015年3月23日 3:32
  • protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { ...

    setFilterExpression();//放到这里可以正确查询button } //setFilterExpression();如果该方法放到这里,button执行提交后,无法正确查询 ApplyFilterExpression(); } #region 查询与筛选操作 private void setFilterExpression() { ...

    } private void ApplyFilterExpression() { ...

    } #endregion protected void Button1_Click(object sender, EventArgs e) { setFilterExpression(); ApplyFilterExpression(); }

    Web會先跑 Page.Load,後才到 Control的event (就是你這裡的Button.Click)。

    如果你把setFilterExpression()放進(!IsPostBack)裡面,那第一次會跑所有的Page.Load裡面的code。

    跟著End User 按一下Button,Page.Load會跑,但(!IsPostBack){...}裡面的不會跑,DropDownList裡面應該會沒東西,而code就只跑了Page.Load裡的ApplyFilterExpression,再跑Button1_Click的 setFilterExpression和ApplyFilterExpression。

    你原本想的logic是怎樣的?


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    請記得將對您有幫助的回覆標示為解答以幫助其他尋找解答及參與社群討論的朋友們。
    Please remember to clickMark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.

    用户点击后,DropDownList裡面有東西,是因为dropdownlist具有viewstate
    2015年3月26日 0:16