我有你的基本asp.net web表单,其中包含一些客户端JavaScript,强制页面超时,然后在5分钟后重定向。主要是为了保护可能敏感的信息。
在超时时,我想强制退回服务器,允许我保存表单值以供将来编辑。
我使用过ClientScript.GetPostBackClientHyperlink()和ClientScript.GetPostBackEventReference()。两者似乎都会导致我遇到EventValidation问题。是的,我可以关闭事件验证但是有不同或更好的工作量吗?
理想情况下,我不想调用一个控件(必须显示),但只是引起一个带有某种类型参数的回发,我认为服务器端是超时条件的结果。
答案 0 :(得分:1)
这可能有点矫枉过正,但您可以设置一个javascript计时器来触发Web服务调用。 .NET Web服务可以接受表单数据并保存。
答案 1 :(得分:1)
没有很好的解决方案,所以我自己建立。一个非常简单的自定义控件欢迎评论。
using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace BinaryOcean.Web.Library.WebControls
{
[ToolboxData("<{0}:PostBackTimer runat=\"server\" />"), DefaultProperty("Seconds"), DefaultEvent("Timeout")]
public class PostBackTimer : Control, IPostBackEventHandler
{
public PostBackTimer() { }
public string CommandArgument
{
get { return (string)ViewState["CommandArgument"] ?? string.Empty; }
set { ViewState["CommandArgument"] = value; }
}
public string CommandName
{
get { return (string)ViewState["CommandName"] ?? string.Empty; }
set { ViewState["CommandName"] = value; }
}
public bool Enabled
{
get { return (bool)(ViewState["Enabled"] ?? true); }
set { ViewState["Enabled"] = value; }
}
public int Seconds
{
get { return (int)(ViewState["Seconds"] ?? 0); }
set { ViewState["Seconds"] = value; }
}
[Description("PostBackTimer_OnTimeout")]
public event EventHandler Timeout = delegate { };
[Description("PostBackTimer_OnCommand")]
public event CommandEventHandler Command = delegate { };
public void RaisePostBackEvent(string eventArgument)
{
Timeout(this, EventArgs.Empty);
Command(this, new CommandEventArgs(CommandName, CommandArgument));
}
protected override void OnPreRender(EventArgs e)
{
if (Enabled && Seconds > 0)
{
var postback = Page.ClientScript.GetPostBackEventReference(this, null);
var script = string.Format("setTimeout(\"{0}\",{1});", postback, Seconds * 1000);
Page.ClientScript.RegisterStartupScript(GetType(), "PostBackTimer_" + UniqueID, script, true);
}
base.OnPreRender(e);
}
}
}
答案 2 :(得分:0)
你不能使用javascript计时器“点击”提交按钮吗?听起来好像使用这种形式会非常烦人,如果它在你试图填写它的时候不断回发。
答案 3 :(得分:0)
使用javascript,请致电__doPostBack("clientIdOfSubmitButton", null)
。这将触发回发,就像该按钮(或您想要的任何其他控件)已触发它一样。