4

刷新时重复的Asp.Net 按钮事件再次触发???图形用户界面?

你好,我是一个网站,当用户单击按钮和页面回发时,如果用户刷新页面或按 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 + "@";

    }
}
4

5 回答 5

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());
    }
于 2009-04-05T07:30:28.837 回答
4

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

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

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

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

于 2009-04-05T06:01:13.857 回答
1

这并不能解决问题。

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

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

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

于 2012-02-22T15:21:08.243 回答
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"];
于 2013-06-14T21:55:49.280 回答
0

我尝试了很多方法,最终查找了触发回发/刷新时发送的表单数据...我发现创建的任何 VIEWSTATE 都有一个键,您可以比较这些键,例如...

我把它放在我的自定义主页上,以便像属性一样重用它

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;
     }
}
于 2019-05-06T17:30:20.457 回答