c# - TextBox AutoPostBack 抢占更多事件

标签 c# asp.net

在一个简单的 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/

相关文章:

c# - 这是 C# 的有效、惰性、线程安全的 Singleton 实现吗?

c# - 使用彭博新闻的 RSS 源

c# - 如何隐藏母版页导航栏中的元素

c# - 删除自引用类的对象时出现 DbUpdateException

c# - 如何在 C# 中将 List<dynamic> 转换为 List<OurClass>

c# - 检测敌人是否面对玩家

c# - var 不适用于 DataGridViewRow

c# - 查看 MVC 2 中无法正常工作的数据

c# - 在设计时更改自定义控件的默认 Text 属性

javascript - 使用 Javascript 从 HTML 表中获取字段