回发后覆盖的值?

时间:2014-05-14 12:35:51

标签: c# asp.net

我有一个reporting.aspx页面。如果页面加载没有参数,则显示项目列表,单击其中一个项目将加载带有projectId参数的同一页面,并显示该项目的实际报告。

此报告有两个文本框:FromDateText和ToDateText。这两个框的文本应该是今天的日期,或者应该是URL的另外两个参数的值。我的问题是,它会在按钮可以调用Response.Redirect之前的今天重新初始化两个框的文本。

一些代码:

    protected void Page_Load(object sender, EventArgs e)
    {
        bool projectIdAvailable = this.Request.QueryString["ProjectID"] != null;
        if (!projectIdAvailable)
        {
            // Load list with buttons
            // Each button loads the page again with a ProjectId as parameter
            foreach (var project in ListOfAllProjects)
            {
                var button = new Button
                    {
                        Text = project.Name,
                        PostBackUrl = string.Format("Reporting.aspx?ProjectID={0}", project.Id)
                    };
                MyPanel.Controls.Add(button);
            }
        }
        else
        {
            // Can't use if (!IsPostBack) as it will always be a postback at this place.
            LoadReporting();
        }
    }

    private void LoadReporting()
    {
        // If we have date as parameter use it, else take today
        if (this.Request.QueryString["fromDate"] != null)
        {
            this.FromDateText.Text = this.Request.QueryString["fromDate"];
        }
        else
        {
            this.FromDateText.Text = DateTime.Now.ToShortDateString();
        }

        if (this.Request.QueryString["toDate"] != null)
        {
            this.ToDateText.Text = this.Request.QueryString["toDate"];
        }
        else
        {
            this.ToDateText.Text = DateTime.Now.ToShortDateString();
        }

        // Reporting generates a table here...
    }

    // Refresh the page with date parameters
    protected void RefreshButtonClick(object sender, EventArgs e)
    {
        int projectId = int.Parse(this.Request.QueryString["ProjectID"]);
        this.Response.Redirect(
            string.Format(
                "Reporting.aspx?ProjectID={0}&fromDate={1}&toDate={2}",
                projectId,
                this.FromDateText.Text,
                this.ToDateText.Text));
    }

我能想到的最好的解决方案是不在文本框中写下当前日期,这样它就不会覆盖自己,或者我可以使用一些JavaScript,所以我不会得到回发

似乎都不是一个很好的方式。这样做的好方法是什么?

2 个答案:

答案 0 :(得分:2)

您应该只加载数据if(!IsPostBack),而不是每次回发。

protected void Page_Load(object sender, EventArgs e)
{
    bool projectIdAvailable = this.Request.QueryString["ProjectID"] != null;
    if (!projectIdAvailable)
    {
        // Load list with buttons
        // PostBackUrl = "Reporting.aspx?ProjectID=0"
    }
    else
    {
        if(!IsPostBack)
            LoadReporting();
    }
}

默认情况下,内容会保留在ViewState中,因此无需每次都重新加载。

答案 1 :(得分:1)

尝试在!ispostback内加载..否则,每次回发都会重置值..

protected void Page_Load(object sender, EventArgs e)
{
    bool projectIdAvailable = this.Request.QueryString["ProjectID"] != null;
    if (!projectIdAvailable)
    {
        // Load list with buttons
        // PostBackUrl = "Reporting.aspx?ProjectID=0"
    }
    else
    {
        if(!IsPostBack)
        {
            LoadReporting();
        }
    }
}