重复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 + "@";
}
}
答案 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; } }