0

我有你的基本 asp.net 网络表单,其中包含一些客户端 JavaScript,它强制页面超时,然后在 5 分钟后重定向。主要是为了保护可能的敏感信息。

在超时时,我想强制服务器回发,允许我保存表单值以供将来编辑。

我玩过 ClientScript.GetPostBackClientHyperlink() 和 ClientScript.GetPostBackEventReference()。两者似乎都对我造成了 EventValidation 问题。是的,我可以关闭事件验证,但是否有不同或更好的工作方式?

理想情况下,我不想调用控件(必须显示),而只是使用某种类型的参数进行回发,我可以将服务器端识别为超时条件的结果。

4

4 回答 4

1

这可能有点矫枉过正,但您可以设置一个 javascript 计时器来触发 Web 服务调用。.NET Web 服务可以接受表单数据并将其保存。

于 2009-02-09T18:29:29.953 回答
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);
        }
    }
}
于 2009-02-10T18:54:23.700 回答
0

您不能使用 javascript 计时器来“单击”提交按钮吗?听起来使用这个表格真的很烦人,如果它在你试图填写它的时候一直发回。

于 2009-02-09T18:30:51.307 回答
0

使用 javascript,调用__doPostBack("clientIdOfSubmitButton", null). 这将触发回发,就像该按钮(或您想要的任何其他控件)已触发它一样。

于 2009-02-10T19:01:12.407 回答