我有一个Button_click
事件。 虽然刷新页面之前的Postback
事件再次触发。 如何识别页面刷新事件,以防止Postback
动作?
我想下面的代码来解决它。 其实,我加入在SharePoint页面的可视web部件。 添加的WebPart是一个回事件如此!回发永远是假的每个我添加的WebPart页面的时间,我在别的循环得到一个错误,因为对象引用是null
。
if (!IsPostBack){
ViewState["postids"] = System.Guid.NewGuid().ToString();
Cache["postid"] = ViewState["postids"].ToString();
}
else{
if (ViewState["postids"].ToString() != Cache["postid"].ToString()){
IsPageRefresh = true;
}
Cache["postid"] = System.Guid.NewGuid().ToString();
ViewState["postids"] = Cache["postid"].ToString();
}
我该如何解决这个问题?
using the viewstate worked a lot better for me as detailed here. Basically:
bool IsPageRefresh = false;
//this section of code checks if the page postback is due to genuine submit by user or by pressing "refresh"
if (!IsPostBack)
{
ViewState["ViewStateId"] = System.Guid.NewGuid().ToString();
Session["SessionId"] = ViewState["ViewStateId"].ToString();
}
else
{
if (ViewState["ViewStateId"].ToString() != Session["SessionId"].ToString())
{
IsPageRefresh = true;
}
Session["SessionId"] = System.Guid.NewGuid().ToString();
ViewState["ViewStateId"] = Session["SessionId"].ToString();
}
这篇文章可能会帮你http://www.codeproject.com/Articles/68371/Detecting-Refresh-or-Postback-in-ASP-NET
要添加一个GUID到视图状态来唯一地标识每一页。 当你在Page类本身这个机制工作正常。 如果你需要到达的页面处理程序之前识别的请求,则需要使用不同的机制(因为视图状态尚未恢复)。
该Page.LoadComplete事件是一个合理的地方,检查是否GUID是与页面关联,如果没有,创建一个。
检查这个http://shawpnendu.blogspot.in/2009/12/how-to-detect-page-refresh-using-aspnet.html
如果要检测上的HTTP刷新GET而不是仅仅的帖子,这里是一个哈克变通办法是,在现代浏览器,大多工作。
使用Javascript:
window.onload = function () {
// regex for finding "loaded" query string parameter
var qsRegex = /^(\?|.+&)loaded=\d/ig;
if (!qsRegex.test(location.search)) {
var loc = window.location.href + (window.location.search.length ? '&' : '?') + 'loaded=1';
window.history.replaceState(null, document.title, loc);
}
};
C#:
public bool IsPageRefresh
{
get
{
return !string.IsNullOrEmpty(Request.QueryString["loaded"]);
}
}
页面加载时,它会改变添加的查询参数loaded=1
而无需重新加载页面(再次,this-- window.history.replaceState
--only在工作后的陈旧浏览器 )。 然后,当用户刷新页面,服务器可以检查的情况下loaded
的查询字符串参数。
警告: 大部分作品
其中,这是行不通的情况是,当用户点击地址栏按下回车 。 也就是说,服务器会产生假阳性,检测刷新,当赔率是,用户实际上意味着重新加载页面清新。
根据你的目的,也许这是可取的,但作为一个用户,这将推动我疯了,如果我预期重置的页面。
我还没有把太多心思进去,但有可能写一些魔术,在使用任何/所有的区分通过地址栏重置刷新:
-
SessionState
(假设SessionState
被启用)和的值loaded
查询字符串参数 - 在
window.onbeforeunload
事件监听器 - 键盘事件(检测F5和Ctrl + R快速改变URL回卸下
loaded
查询参数-虽然这样的假阴性的点击浏览器的刷新按钮) - 饼干
如果有人想出了一个解决方案,我很乐意听到这种说法。
另一种方法来检查刷新页面。 我已经写了自定义代码没有Java脚本或任何客户端。
不知道,这是最好的方式,但我觉得身边的好工作。
protected void Page_Load(object sender, EventArgs e)
{
if ((Boolean)Session["CheckRefresh"] is true)
{
Session["CheckRefresh"] = null;
Response.Write("Page was refreshed");
}
else
{ }
}
protected void Page_PreInit(object sender, EventArgs e)
{
Session["CheckRefresh"] = Session["CheckRefresh"] is null ? false : true;
}