gpt4 book ai didi

c# - TextBox AutoPostBack 抢占更多事件

转载 作者:行者123 更新时间:2023-11-30 13:50:20 24 4
gpt4 key购买 nike

在一个简单的 ASP 页面中,TextBox AutoPostBack 事件将阻止按钮单击事件(除非按钮被快速点击)和其他控件(如 ListBox)的 AutoPostBack 事件。

这里有一个类似的问题,但我对被迫使用客户端或 AJAX 解决方案感到不满意:Have to click button twice in asp.net (after autopostback textbox)

示例 ASPX 页面:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="temp.aspx.cs" Inherits="temp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server" AutoPostBack="True" OnTextChanged="PostBack"></asp:TextBox>
<asp:Button ID="Button1" runat="server" OnClick="PostBack" Text="Button" /><br />
<asp:ListBox ID="ListBox1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="PostBack">
<asp:ListItem>value1</asp:ListItem>
<asp:ListItem>value2</asp:ListItem>
</asp:ListBox><br />
<br />
Events Fired:<br />
<asp:TextBox ID="TextBox2" runat="server" Height="159px" TextMode="MultiLine" Width="338px"></asp:TextBox></div>
</form>
</body>
</html>

背后的 C# 代码:

public partial class temp : System.Web.UI.Page
{
protected void PostBack(object sender, System.EventArgs e)
{
this.TextBox2.Text += string.Format("PostBack for - {0}\n", ((System.Web.UI.Control)sender).ID);
}
}

我已经能够通过使用 mousedown 而不是点击事件来提交表单来部分解决按钮的这个问题(我还在客户端阻止了额外的 AutoPostBack 事件,并在按钮点击事件服务器端处理了任何额外的字段更改)

但是,这意味着我的按钮并没有按照标准(点击释放)方式运行。

对于这个问题,是否有更好的解决方案不需要尝试在 javascript 客户端中完成所有操作? (我正在编写大量代码来在这些回发期间读取服务器数据,因此 javascript 不是理想的解决方案。)

我还试图避免为这些页面切换到 AJAX 库,因为我添加的每个新库都必须经过安全审核等。

注意:我目前正在使用 ASP.Net 2.0/VS 2005,但如果此类问题在以后的版本中得到修复,那将是一个令人信服的升级理由。 (据我了解,在ASP.Net 4/VS 2010中似乎也出现了同样的问题)

最佳答案

在字段(或其他输入控件)上设置 AutoPostBack="true"的原因是因为您希望页面在该控件的数据更改时回发 - 而无需用户单击按钮。听起来这正是正在发生的事情:当字段失去焦点时,页面会进行回发。

也许我误解了这个问题?您能否提供更多有关您需要页面/表单如何运行的信息?

编辑:更多信息,基于 OP 的评论。

我想我明白了:“正常”情况是他们从 DropDownList1 中选择某些内容,然后您根据 DropDownList1 中的所选项目自动回传以设置 DropDownList2 的值。但是,用户可能并不关心第二个列表;如果他们单击“搜索”,您希望单击按钮实质上中止自动回发(已经在进行中),并启动新的回发。

不幸的是,我认为在任何版本的 ASP.NET 中都没有任何功能可以“中止”已经在进行中的回发(无论如何不是来自客户端代码)。因此,为了实现上述行为,您将不得不在标准 ASP.NET 回发行为之外做一些事情。这里有一些想法,但绝不是一个详尽的 list :

  • 使用 AJAX 和 JS 检索 DropDownList2 的内容。如果用户在该 ajax 调用正在进行时单击搜索,页面应立即回发。
  • 在您的页面中以 JSON 格式存储所有可能的 DropDownList2 数据;当 List1 更改时,使用纯客户端 JS 填充 List2。同样,如果用户单击“搜索”,页面将立即回传。根据可能的 List2 条目池的大小,这可能会使页面大小膨胀到无法使用。
  • 当 List1 更改选择时,使用客户端 JS 禁用您的搜索按钮。在自动回发(填充 List2)完成之前,用户将无法点击“搜索”。

希望这对您有所帮助!

关于c# - TextBox AutoPostBack 抢占更多事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6629099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com