在C#中防止页面刷新

时间:2009-04-05 05:28:12

标签: asp.net postback refresh

重复Asp.Net Button Event on refresh fires again??? GUID?

你好,我有一个网站,当用户点击按钮和页面回发时,如果用户刷新页面或点击F5,则再次调用按钮方法。

任何人都知道某种方法可以防止页面刷新,而不会再次将页面重定向到同一页面?

像if(page.isRefresh)之类的东西......或者如果存在任何javascript解决方案更好。

这看起来有效....但是当我刷新它不回发但在文本框中显示之前的值

http://www.dotnetspider.com/resources/4040-IsPageRefresh-ASP-NET.aspx

private Boolean IsPageRefresh = false;
protected void Page_Load(object sender, EventArgs e)
{        
    if (!IsPostBack)
    {
        ViewState["postids"] = System.Guid.NewGuid().ToString();
        Session["postid"] = ViewState["postids"].ToString();
        TextBox1.Text = "Hi";

    }
    else
    {
        if (ViewState["postids"].ToString() != Session["postid"].ToString())
        {
            IsPageRefresh = true;
        }
        Session["postid"] = System.Guid.NewGuid().ToString();
        ViewState["postids"] = Session["postid"];
    }
}
protected void Button1_Click(object sender, EventArgs e)
{
    if (!IsPageRefresh) // check that page is not refreshed by browser.
    {
        TextBox2.Text = TextBox1.Text + "@";

    }
}

5 个答案:

答案 0 :(得分:8)

感谢您的评论并抱歉我的错误, 我发现这个代码在: http://www.codeproject.com/KB/aspnet/Detecting_Refresh.aspx 这次测试了;)

    private bool _refreshState;
    private bool _isRefresh;

    protected override void LoadViewState(object savedState)
    {
        object[] AllStates = (object[])savedState;
        base.LoadViewState(AllStates[0]);
        _refreshState = bool.Parse(AllStates[1].ToString());
        _isRefresh = _refreshState == bool.Parse(Session["__ISREFRESH"].ToString());
    }

    protected override object SaveViewState()
    {
        Session["__ISREFRESH"] = _refreshState;
        object[] AllStates = new object[2];
        AllStates[0] = base.SaveViewState();
        AllStates[1] = !(_refreshState);
        return AllStates;
    }

    protected void btn_Click(object sender, EventArgs e)
    {
        if (!_isRefresh)
            Response.Write(DateTime.Now.Millisecond.ToString());
    }

答案 1 :(得分:4)

您可以测试Page.IsPostBack属性,以查看页面是否响应初始请求,或者是否正在处理PostBack,例如按钮单击事件。以下是更多信息:w3schools on IsPostBack

不幸的是,这不会解决您的问题,因为当用户单击按钮时以及在按钮操作发生后刷新页面时IsPostBack将成立。

如果您正在执行类似于对某些数据执行CRUD的任务,您可以在完成处理后将Response.Redirect回到同一页面并解决此问题。它具有重新加载内容的附带好处(假设您在数据库中添加了一条记录,它现在将显示在页面中......)并防止刷新问题行为。唯一需要注意的是,他们仍然会重新提交他们的历史。

对于Asp.net来说,回发是一个糟糕的实现选择,而且通常会毁了我的Webforms平台。

答案 2 :(得分:1)

这不能解决问题。

首先,将令牌存储在视图状态不是一个好主意,因为它可以被禁用。改为使用控制状态。虽然,HttpModule是一个更好的解决方案。

总而言之,无论如何这都行不通。如果您打开另一个选项卡/窗口,则会话对于上一个选项卡/窗口将无效。因此制动它。每次首次加载页面时,您必须以某种方式存储唯一值。使用它来确定请求的来源,然后检查“刷新票证”。正如您所看到的,一个用户的对象可能会变得非常大,具体取决于发出的请求数量,存储此信息的位置和时长。

我还没有看到任何解决方案,因为它非常复杂。

答案 3 :(得分:1)

     bool IsPageRefresh ;

 if (Page.IsPostBack)
    {
        if (ViewState["postid"].ToString() != Session["postid"].ToString())
            IsPageRefresh = true;
    }
    Session["postid"] = System.Guid.NewGuid().ToString();
    ViewState["postid"] = Session["postid"];

答案 4 :(得分:0)

我尝试了很多方法,最终找到了触发回发/刷新时发送的表单数据...我发现有一个用于创建的VIEWSTATE的键,您可以像这样比较这些键... < / p>

我将其放在自定义基页上,以像属性一样重复使用

public bool IsPageRefresh = false;
protected void Page_Init(object sender, EventArgs e)
{
     if (IsPostBack)
     {
          var rForm = Request.Form;
          var vw = rForm["__EVENTVALIDATION"].ToString();
          var svw = Session["__EVENTVALIDATION"] ?? "";
          if (vw.Equals(svw)) IsPageRefresh = true;
               Session["__EVENTVALIDATION"] = vw;
     }
}