ASP.NET客户端回发

时间:2009-02-09 18:19:35

标签: asp.net postback

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

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

我使用过ClientScript.GetPostBackClientHyperlink()和ClientScript.GetPostBackEventReference()。两者似乎都会导致我遇到EventValidation问题。是的,我可以关闭事件验证但是有不同或更好的工作量吗?

理想情况下,我不想调用一个控件(必须显示),但只是引起一个带有某种类型参数的回发,我认为服务器端是超时条件的结果。

4 个答案:

答案 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)。这将触发回发,就像该按钮(或您想要的任何其他控件)已触发它一样。