【问题标题】:ASP.NET Client Side PostbackASP.NET 客户端回发
【发布时间】:2009-02-09 18:19:34
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: asp.net postback


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      没有很好的解决方案,所以我自己构建。一个非常简单的自定义控件。欢迎评论。

      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);
              }
          }
      }
      

      【讨论】:

        【解决方案3】:

        您不能使用 javascript 计时器来“单击”提交按钮吗?不过,如果在您尝试填写时它一直发回,听起来使用此表单会很烦人。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-10-28
            • 2011-03-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多