我有一个Button_click
事件。刷新页面时,之前的Postback
事件再次触发。如何识别页面刷新事件以阻止Postback
操作?
我尝试了下面的代码来解决它。实际上,我在SharePoint页面中添加了一个可视webpart。添加webpart是一个回发事件所以!每次我将webpart添加到页面时回发总是假的,并且我在else循环中收到错误,因为对象引用是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();
}
如何解决这个问题?
答案 0 :(得分:10)
使用viewstate对我来说效果更好,详见here。基本上是:
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();
}
答案 1 :(得分:5)
这篇文章对您有所帮助 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
答案 2 :(得分:0)
如果你想在HTTP GET上检测刷新,而不是仅检测POST,那么在现代浏览器中,这是一个很糟糕的解决办法,大部分都可以使用。
使用Javascript:
public bool IsPageRefresh
{
get
{
return !string.IsNullOrEmpty(Request.QueryString["loaded"]);
}
}
C#:
loaded=1
当页面加载时,它会更改添加window.history.replaceState
的QueryString参数而不重新加载页面(再次,这个 - loaded
- 仅适用于post-archaic browsers)。然后,当用户刷新页面时,服务器可以检查查询字符串的SessionState
参数是否存在。
这不起作用的情况是当用户单击地址栏并按输入时。也就是说,服务器会产生误报,检测到刷新,当赔率是,用户实际上是要重新加载页面。
根据您的目的,这可能是可取的,但作为用户,如果我希望它重置页面,它会让我发疯。
我没有过多考虑,但可能可以编写一些魔法,以便通过地址栏使用any / all:<区分刷新和重置/ p>
SessionState
(假设已启用loaded
)和window.onbeforeunload
QueryString参数的值loaded
事件监听器如果有人提出解决方案,我很乐意听到。
答案 3 :(得分:0)
检查页面刷新的另一种方法。我编写了没有java脚本或任何客户端的自定义代码。
不确定,这是最好的方式,但我感觉很好。
if($_GET["action"] == 1){
$action = "_GET";
}else{
$action = "_POST";
}
...
${$action["lang_id"]}
答案 4 :(得分:0)
简单解决方案
我认为我会发布这个简单的3行解决方案,以防它对某人有所帮助。发布后,会话和viewstate的IsPageRefresh值将相等,但是在页面刷新时它们将不同步。然后触发重定向以重置页面。如果要保留查询字符串参数,则需要稍微修改重定向。
protected void Page_Load(object sender, EventArgs e)
{
var id = "IsPageRefresh";
if (IsPostBack && (Guid)ViewState[id] != (Guid)Session[id]) Response.Redirect(HttpContext.Current.Request.Url.AbsolutePath);
Session[id] = ViewState[id] = Guid.NewGuid();
// do something
}
答案 5 :(得分:0)
这对我来说很好。
bool isPageRefreshed = false;
protected void Page_Load(object sender, EventArgs args)
{
if (!IsPostBack)
{
ViewState["ViewStateId"] = System.Guid.NewGuid().ToString();
Session["SessionId"] = ViewState["ViewStateId"].ToString();
}
else
{
if (ViewState["ViewStateId"].ToString() != Session["SessionId"].ToString())
{
isPageRefreshed = true;
}
Session["SessionId"] = System.Guid.NewGuid().ToString();
ViewState["ViewStateId"] = Session["SessionId"].ToString();
}
}