【问题标题】:Detecting target of postback early in page_load to exit so click handler can run在 page_load 中尽早检测回发目标以退出,以便单击处理程序可以运行
【发布时间】:2014-10-22 17:49:16
【问题描述】:

我有一个带有gridview 和其他几个按钮的webforms 页面。在调试中,我注意到所有与 gridview 的绑定都是在 Page_Load 子中的回发期间执行的。只有在这一切都完成之后,才会调用单击处理程序,并且在我的情况下,处理程序会执行 Response.Redirect 到另一个页面。

所以,我在 SO:Run the button event handler before page_load 上找到了这个。

这表明在 page_load 期间检测回发目标的可能性,我正在考虑在这种情况下退出 page_load 并让按钮单击处理程序加载新页面(即避免所有浪费的构建和格式化 gridview。

这是我的 Page_Load 中的一个 sn-p:

    If IsPostBack Then
        Dim targetOfPostBack As String = Request.Params("__EVENTTARGET").ToString()
    End If

在 PostBack 期间,__EVENTTARGET 始终是一个空字符串,而不是暗示我单击了“添加”按钮的内容(即 ctl00$MainContentPlaceHolder$btnAddEvent)。被困在这里:

上面 SO 上的 OP 在 C# 中表达了同样的方法,而我的实现是 VB.Net。我究竟做错了什么?

【问题讨论】:

  • 在你的asp按钮上尝试设置UseSubmitBehavior="False"

标签: asp.net vb.net gridview webforms postback


【解决方案1】:

您可以编写客户端脚本来重定向页面,从而避免一起回发。设置“OnClientClick”(Asp.NET 按钮)或“OnClick”(HTML 按钮)属性,然后简单地返回 false。

例如:

脚本:

             function RedirectToURL()             
            try {
             window.open("<Your URL Here>", "_self", "menubar=0,resizable=             
  } catch (e) {

        }
         return flase;
     }

按钮:

 <input type="button" id="btnToggleConfig" onclick="RedirectToURL()" runat="server"
                        value="Click here to Goto Link" />

【讨论】:

    【解决方案2】:

    在你的 asp 按钮上尝试设置UseSubmitBehavior="False"

    使用UseSubmitBehavior 属性指定Button 控件是使用客户端浏览器的提交机制还是ASP.NET 回发机制。默认情况下,此属性的值为 true,导致 Button 控件使用浏览器的提交机制。如果指定 false,则 ASP.NET 页面框架将客户端脚本添加到页面以将表单发布到服务器。

    当 UseSubmitBehavior 属性为 false 时,控件开发人员可以使用 GetPostBackEventReference 方法为 Button 返回客户端回发事件。 GetPostBackEventReference 方法返回的字符串包含客户端函数调用的文本,可以插入到客户端事件处理程序中。

    http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.button.usesubmitbehavior(v=vs.110).aspx

    【讨论】:

    • 谢谢。添加 UseSubmitBehavior FALSE 现在让我看到 targetOfPostBack = "ctl00$MainContentPlaceHolder$btnAddEvent"。我将如何使用此字符串来查找导致 PostBack 的控件类型?简而言之,如果 PostBack 是针对 gridview 的,我想通过调用将数据源绑定到 gridview 的 LoadGridView 子来完成 Page_Load;如果有任何其他控件(例如上述按钮),我想退出 Page_Load 并让按钮单击处理程序做他们的事情(即避免整个 gridview 事情)。如何解析字符串以确定控件类型(可能是FindControl?)
    【解决方案3】:

    这是工作中的 ASP.NET 页面生命周期:http://msdn.microsoft.com/en-us/library/ms178472(v=vs.85).aspx

    几个选项:

    1. 查看此帖子以了解 _EVENTTARGET 是否为空: __EVENTTARGET is empty on postback of button click
    2. 在客户端处理重定向(如果可能)
    3. 如果可以的话,只在 page_load(如果不是 IsPostback)上填充 gridview 一次
    4. 如果您只是担心重新创建网格视图并消耗一些“处理能力”或时间(具体取决于大小、用户等),则可能不是什么大问题,所以可以保持原样。

    【讨论】:

      猜你喜欢
      • 2013-04-24
      • 1970-01-01
      • 2015-12-24
      • 2018-10-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2017-08-04
      • 1970-01-01
      相关资源
      最近更新 更多