2

在网上搜索后,似乎有一个强烈的共识,即防止刷新触发数据库访问的一个好方法是使用 ViewState 变量和 Session 变量来检测条件。这是我的基页类中的代码:

    protected override void OnLoad( EventArgs e )
    {
        base.OnLoad( e ); 

        if ( IsPostBack && ViewState["REFRESH_CHECK"] != Session["REFRESH_CHECK"] )
        {
            IsRefresh = true;
        }
        Session["REFRESH_CHECK"] = System.Guid.NewGuid().ToString();
        ViewState["REFRESH_CHECK"] = Session["REFRESH_CHECK"];
    }

    public virtual bool IsRefresh
    {
        get;
        private set;
    }

所以在我的页面中,我有一些看起来像这样的代码:

    protected void Page_Load( object sender, EventArgs e )
    {
        if ( !IsPostBack )
        {
            if ( !IsRefresh )
            {
                doStuffThatShouldOnlyBeDoneOnce();
            }
        }
    }

这在调试时工作得很好,但是当我在生产系统上运行时,我总是得到两次 doStuff...() 方法的调用。当然,当我调试它时,只有一个调用。

它可能相关也可能不相关,但我也在使用嵌套母版页。

有任何想法吗?

4

2 回答 2

2

哦,伙计,请不要使用此代码,这可能会破坏您的网页。对于一个简单的测试,尝试使用两个不同的选项卡打开同一页面,您将看到解决方案失败。F5 刷新问题的唯一解决方案是Response.Redirect. 我已经尝试过这个解决方案,所以我根据我的经验告诉你。

于 2012-10-19T15:05:25.637 回答
0

半答案

我无法弄清楚为什么 Page_Load() 在生产环境中被调用两次,而在调试模式下只被调用一次。

关于刷新两次访问数据库的技术都没有对我有用。

所以我采取的方法是改变工作的完成地点。我没有在加载新页面时执行代码,而是在重定向之前按下按钮控件时在委托中执行代码。

delegate( Object o, EventArgs eventArgs ) 
{
    doStuffHere();
    HttpContext.Current.Response.Redirect( "admin/Admin.aspx", false );
}

在这种情况下,下一页需要在上一页的基础上进行一些设置,只要我在所有重定向之前都使用这个,一切都很好。如果用户直接访问 URL,这不起作用,但对于这种特殊情况,没关系 - 页面不会完全填充,但不会导致错误,用户仍然可以工作。

于 2012-10-19T18:29:55.923 回答