我有一个文本框,可以从扫描仪或扫描的条形码项目获取信息。但是,当我扫描条形码时,它会导致自动回发,从而删除所有已输入的信息。我试过了
<asp:TextBox ID="bookISBN" runat="Server" AutoPostBack="false" OnTextChanged="bookISBN_TextChanged"></asp:TextBox>
隐藏代码:
protected void bookISBN_TextChanged(object sender, EventArgs e)
{
DateTime lastKeyPress = DateTime.Now;
string bBookISBN = string.Empty;
while (((TimeSpan)(DateTime.Now - lastKeyPress)).TotalSeconds > 600)
{
bBookISBN = bookISBN.Text;
}
}
<script type="text/javascript">
document.getElementById('<%= bookISBN.ClientID %>').addEventListener('keydown', function (e) {
if (e.keyCode == 13) { // Enter key
e.preventDefault(); // Prevent the form from submitting
}
});
</script>
作为一般规则,在任何 ASP.NET 页面上,当用户按下 Enter 键时,任何输入框后面的按钮都将被“单击”或触发。
但是,我必须假设扫描仪在扫描后发送“输入键”,我们可能希望这种情况发生!
现在,页面上的回发不应“清空”文本框,除非我们弄乱了该页面上的代码。
还记得,对于任何按钮单击、任何文本框事件或任何触发回发的事件吗?
嗯,页面加载事件首先触发(运行),然后你的代码存根运行。当然,如果在组合中使用“输入键”,那么您可能会遭受 2 页回发。一个来自文本框(在更改事件 + autopostback = true 时),然后一个来自标记中后续(稍后)页面上的按钮。
一个简单的修复方法是从文本框中删除自动回发(和事件),并在文本框后面放置一个按钮。现在,当您扫描时,输入键当然会运行/单击按钮。因此,然后将扫描代码放入按钮存根中。
如果您不想显示/显示按钮,只需使用 style="display:none" 隐藏按钮即可。
最后但并非最不重要的一点是,请检查您的页面加载代码存根,因为多年来我经常意外地放置一些控件设置代码(例如设置控件的默认值并加载一些组合框)。然而,您只希望这样的设置代码在真正的首页加载时运行,因此对于我制作的最后 200 个网页,我总是在页面加载事件中包含此代码:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
' setup code here to load up combo box, controls and grid view
End If
End Sub
如果您未能使用上述 Not IsPostBack 检查,那么您的页面加载事件将在您拥有的按钮或事件代码存根之前每次触发。因此,此类设置和控制加载代码当然会覆盖用户所做的任何选择。因此,请检查您的页面加载事件,并检查是否有“所有重要的”回发检查,因为如果没有“注意 IsPostBack”检查,您实际上无法构建一个工作网页,该检查仅在第一个“真实”上运行页面加载。