Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 在C中防止页面刷新#_Asp.net_Postback_Refresh - Fatal编程技术网

Asp.net 在C中防止页面刷新#

Asp.net 在C中防止页面刷新#,asp.net,postback,refresh,Asp.net,Postback,Refresh,副本 您好,我有一个网站,当用户单击一个按钮并返回页面时,如果用户刷新页面或点击F5,则会再次调用button方法 有人知道防止页面刷新而不将页面再次重定向到同一页面的方法吗 像if(page.isRefresh)之类的东西。。。或者,如果存在任何javascript解决方案,则更好 这被认为是有效的。。。。但当我刷新时,它不会回发,而是在文本框中显示before值 您可以测试Page.IsPostBack属性,以查看页面是否响应初始请求,或者是否正在处理回发,例如按钮单击事件。这里有更多的信

副本

您好,我有一个网站,当用户单击一个按钮并返回页面时,如果用户刷新页面或点击F5,则会再次调用button方法

有人知道防止页面刷新而不将页面再次重定向到同一页面的方法吗

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

这被认为是有效的。。。。但当我刷新时,它不会回发,而是在文本框中显示before值


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

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

如果您正在执行诸如对某些数据执行CRUD之类的任务,则可以响应。在完成处理后,将用户重定向回同一页面,并避开此问题。它的另一个好处是重新加载内容(假设您向数据库中添加了一条记录,它现在将显示在页面中…),并防止出现刷新问题行为。唯一需要注意的是,他们仍然通过返回历史来重新提交表单


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

感谢您的评论,并为我的错误感到抱歉, 我在以下文件中找到此代码: 这一次是经过测试的;)


这并不能解决问题

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

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


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

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

     bool IsPageRefresh ;

 if (Page.IsPostBack)
    {
        if (ViewState["postid"].ToString() != Session["postid"].ToString())
            IsPageRefresh = true;
    }
    Session["postid"] = System.Guid.NewGuid().ToString();
    ViewState["postid"] = Session["postid"];
我把它放在我的自定义基页上,像一个属性一样重用它


这对刷新不起作用,当你刷新页面时,它会告诉浏览器重复上一个事件,这会多次停止按钮的工作,不管帖子是来自重新加载还是实际的按钮单击。是的,这是有效的。这与我找到的代码相同,但当您单击按钮并单击“刷新”时,它会显示“HI”,而不是新值:P我想我可以接受,我会尝试修改这个。谢谢,但是如果页面指令中禁用了viewstate怎么办?Response.Redirect无法解决这个问题。用户仍然可以使用浏览器中的“后退”按钮返回,并在他们提交表单的位置刷新,它仍然会向数据库发送另一个请求get defined?最好将其用作全局变量,并在pageload方法上使用其余的代码,这样您就可以随时使用IsPageRefresh。
    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());
    }
     bool IsPageRefresh ;

 if (Page.IsPostBack)
    {
        if (ViewState["postid"].ToString() != Session["postid"].ToString())
            IsPageRefresh = true;
    }
    Session["postid"] = System.Guid.NewGuid().ToString();
    ViewState["postid"] = Session["postid"];
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;
     }
}