回发后覆盖的值

本文关键字:覆盖 | 更新日期: 2023-09-27 18:03:23

我有一个报告。aspx页面。如果页面加载时没有参数,它会显示一个项目列表,单击其中一个项目将加载带有投影参数的相同页面,并显示该项目的实际报告。

这个报告有两个文本框: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,这样我就不会得到回发。

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

回发后覆盖的值

您应该只加载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中,因此不需要每次都重新加载。

尝试在!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();
        }
    }
}