在搜索网络后,似乎有一种强烈的共识,即防止刷新触发数据库访问的好方法是使用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 ...()方法的调用。当然,当我调试它时,只有一次调用。
它可能相关也可能不相关,但我也使用嵌套的Master页面。
有什么想法吗?
答案 0 :(得分:2)
哦,请不要使用此代码,这可能会破坏您的网页。对于简单的测试,尝试使用两个不同的选项卡打开相同的页面,您将看到解决方案失败。
F5刷新问题的唯一解决方案是Response.Redirect
。
我尝试了这个解决方案,所以我根据自己的经验告诉你。
答案 1 :(得分:0)
半应答
我无法弄清楚为什么在生产环境中调用Page_Load()两次,而在调试模式下只调用一次。
关于刷新数据库两次的技术都没有对我有用。
所以我采取的方法是改变工作的地方。我没有在加载新页面时执行代码,而是在重定向之前按下按钮控件时,在代理中执行代码。
delegate( Object o, EventArgs eventArgs )
{
doStuffHere();
HttpContext.Current.Response.Redirect( "admin/Admin.aspx", false );
}
在这种情况下,下一页需要根据上一页完成一些设置,只要我在所有重定向之前,一切都没问题。如果用户直接访问URL,这不起作用,但对于这种特殊情况即可 - 页面不会被完全填充,但它不会导致错误,用户仍然可以继续工作。