TextBox导致ASP.NET中的Button Postback

时间:2009-05-01 20:20:39

标签: asp.net .net-2.0 postback

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检测来自这些文本框的“输入”按键,但我过去的经验是这种行为在浏览器之间变化很大。有什么建议吗?

8 个答案:

答案 0 :(得分:6)

这是一个更优雅的解决方案

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

阅读整篇文章here

答案 1 :(得分:3)

您可以尝试在asp面板或表单上设置默认按钮。这将允许您控制用户点击回车键时发生的情况。

答案 2 :(得分:3)

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

导致此问题是因为ASP.NET 始终将假定从IButton接口(Button和ImageButton)继承的第一个元素是页面中的默认按钮。

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

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

答案 3 :(得分:1)

您可以禁用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>

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

  

我想我可以通过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会是一样的。

答案 7 :(得分:0)

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

<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>

文本框iself在ul中(由javascript生成) 按回车将触发“doNothingButton”,这将在客户端返回false,导致根本没有回发!