【问题标题】:TextBox causes Button Postback in ASP.NETTextBox 导致 ASP.NET 中的按钮回发
【发布时间】:2010-10-23 05:19:52
【问题描述】:

ASP.NET 2.0,在 FF3 和 IE7 中测试。

当我从文本框中点击“输入”按钮时,会触发页面中第一个 ImageButton 的相应“OnClick”事件。如果我删除该图像按钮,它会触发页面上的下一个 ImageButton OnClick 事件。

在 FireBug 控制台中,如果我使用 JavaScript 提交表单,则不会发生这种情况。但无论出于何种原因,从文本框中按回车都会触发不相关的 ImageButton 事件。

我发现 this question 有类似的问题,但是该解决方案的建议答案不起作用,因为 ImageButtons 上没有“UseSubmitBehavior”属性。

我不明白为什么会触发此事件。如果我查看 Request.Form,我可以看到 __EVENTTARGET 是空的,它实际上是在发布整个表单内容(我所有的文本框),还包括 imageButton.x 和 imageButton.y 键/值对。

这是为什么?我想我可以使用 javascript 从这些文本框中检测到“输入”按键,但我过去的经验是这种行为在浏览器之间是高度可变的。有什么建议吗?

【问题讨论】:

    标签: asp.net .net-2.0 postback


    【解决方案1】:

    您可以尝试在 asp 面板或表单中设置默认按钮。这将让您控制当用户按下回车键时会发生什么。

    【讨论】:

    • 我最终只是添加了一个没有 onclick 事件的新 asp:Button 并将其样式设置为不显示。感觉比检测回车键的 JS 解决方案更干净。
    【解决方案2】:

    这是在非文本区域按下回车按钮以回发表单的默认行为。您必须在 javascript 方法中处理它才能停止回发。

    您只需要检查 window.event.keyCode 属性以查看其是否等于 13。如果是,请将其重置为 0。

    function KeyPress()
      {
         if (window.event.keyCode == 13)
            {
               window.event.keyCode = 0;
            }
      }
    

    【讨论】:

    • window.event 在 FF3 中不存在。
    【解决方案3】:

    我想我可以使用 javascript 从这些文本框中检测到“输入”按键

    这就是我为解决这种行为所做的,它在 IE7 和 FF3 中运行良好。只是有点不自然。

    这是一个通用的例子:

        function TextBox1_KeyDown(sender, e)
        {
        var key;
            if(window.event)
                key = window.event.keyCode; //IE
            else
                key = e.which; //firefox
            if(key == 13 && $("#TextBox1").val() != "")
            {
                WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("TextBox1", "", true, "", "", false, true));
            }
            return (key != 13);
        }
    

    我使用 WebForm_DoPostBackWithOptions 是因为我需要验证器来触发。否则,您可能需要使用 __DoPostBack。

    这里是“原型”:

    function __doPostBack(eventTarget, eventArgument)
    
    function WebForm_PostBackOptions(eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit)
    {
        this.eventTarget = eventTarget;
        this.eventArgument = eventArgument;
        this.validation = validation;
        this.validationGroup = validationGroup;
        this.actionUrl = actionUrl;
        this.trackFocus = trackFocus;
        this.clientSubmit = clientSubmit;
    }
    
    function WebForm_DoPostBackWithOptions(options)
    

    希望对你有帮助。

    P.S.:我在这里使用了 JQuery,但 $get 是一样的。

    【讨论】:

      【解决方案4】:

      您可以禁止按下 Enter 键,这样用户就必须点击您的 ImageButtons。只需将此 javascript 块粘贴到您的页面上:

      <script type="text/javascript">
      function stopRKey(evt) { 
        var evt = (evt) ? evt : ((event) ? event : null); 
        var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null); 
        if ((evt.keyCode == 13) && (node.type=="text"))  {return false;} 
      }
      document.onkeypress = stopRKey;
      </script>
      

      【讨论】:

        【解决方案5】:

        这里有一个更优雅的解决方案

        <asp:TextBox ID="TextBox1" runat="server" onkeydown = "return (event.keyCode!=13);" > </asp:TextBox>

        阅读整篇帖子here

        【讨论】:

          【解决方案6】:

          这是我找到的一个优雅的解决方案,以防其他人遇到此问题(以防所有其他解决方案对您不起作用,因为它们对我不起作用):

          <asp:UpdatePanel runat="server">
          <ContentTemplate>
              <asp:Panel runat="server" DefaultButton="doNothingButton">
                  <ul id="shopping-list-ul">
                  </ul>
                  <asp:Button CssClass="invisible" runat="server" ID="doNothingButton" OnClientClick="return false;" />
              </asp:Panel>
          </ContentTemplate>
          

          文本框本身位于 ul 中(由 javascript 生成)。
          按回车会触发“doNothingButton”,在客户端会返回false,根本不会回发!

          【讨论】:

            【解决方案7】:

            最近,我通过 Web 服务和更少的回发在客户端上做更多的事情。通过将我的控件移到表单元素之外(或完全消除它),问题就消失了。它默认插入到 aspx 页面上,但直到最近我才意识到我在做很多事情时都不需要它。

            【讨论】:

              【解决方案8】:

              我的项目也遇到了同样的问题。

              造成此问题的原因是 ASP.NET总是 会假定从 IButton 接口(按钮和 ImageButton)继承的第一个元素是页面的默认按钮。

              Hipoteticaly,如果您使用 LinkBut​​ton 而不是 Button 或 ImageButton,这个问题就解决了。

              您可以找到更多信息here on MSDN

              【讨论】:

                猜你喜欢
                • 2015-06-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-10-13
                • 2011-12-27
                • 1970-01-01
                • 2014-11-14
                • 1970-01-01
                相关资源
                最近更新 更多