ASP.NET文本框的失去焦点方法是什么?

27

如何为ASP.NET文本框编写失去焦点方法?请问有没有人有这方面的想法并与我分享?

4个回答

38

我知道大家都展示了基本的客户端方法,这很好,但我至少想展示一个处理特定客户端事件的服务器解决方案。

让我们来看看代码,并一步步地解析它。

由于ASP.Net TextBox没有为OnBlur暴露一个服务器端事件,您必须手动完成。幸运的是,这很容易实现。假设您在.aspx页面中有这段小代码。每当TextBox失去焦点时,您希望在服务器端更新一个Label控件。

<asp:Label ID="lblOnBlur" runat="server">On Blur Example</asp:Label><br />
<asp:TextBox ID="tbOnBlur" runat="server" ClientIDMode="Static" /><br />
<asp:Label ID="lblOutput" runat="server" />

ASP.Net内置了一个客户端函数,用于触发后台提交(postback),该函数有两个参数:

  1. 目标(Target):事件源控件的ID。
  2. 参数(Argument):传递给服务器的可选信息。

你可以通过在TextBox的标记中添加以下属性和值来直接将事件与后台代码绑定:

onblur="__doPostBack('tbOnBlur','OnBlur');"

然而,该框架有一个简单的方法可以为您生成服务器端的此脚本。在您的Page_Init方法中,只需添加对GetPostBackEventReference的调用,并将其赋值给您控件的"onblur"属性,如下所示:

protected void Page_Init(object sender, EventArgs e)
{
    var onBlurScript = Page.ClientScript.GetPostBackEventReference(tbOnBlur, "OnBlur");
    tbOnBlur.Attributes.Add("onblur", onBlurScript);
}

通过使用标准的服务器控件事件,实现IPostBackEventHandler接口,事件绑定和调用会自动处理。但对于一次性的解决方案来说,这是很多工作,所以让我们通过检查请求参数来手动处理它。

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        var ctrlName = Request.Params[Page.postEventSourceID];
        var args = Request.Params[Page.postEventArgumentID];

        HandleCustomPostbackEvent(ctrlName, args);
    }
}

private void HandleCustomPostbackEvent(string ctrlName, string args)
{
    //Since this will get called for every postback, we only
    // want to handle a specific combination of control
    // and argument.
    if (ctrlName == tbOnBlur.UniqueID && args == "OnBlur")
    {
        lblOutput.Text = "On Blur Event Handled Server Side!" + DateTime.Now;
    }
}

如果您不介意深入研究框架,模拟服务器端事件并不是非常困难。

希望这可以帮助到您!

祝好,
Josh


非常感谢您美丽的回答,Genii。您的帖子对我来说非常有启发性。 - Ashok kumar
我看到了其他几个关于如何完成这个任务的建议,而你的答案是迄今为止最好的。谢谢! - Aaron
非常好的答案,但是 OnTextChanged 事件已经存在了,当文本框失去焦点时会触发该事件。 - Waqas Raja

18

如果你想在文本框失去焦点后让服务器执行某些操作,可以添加AutoPostback="True"属性,如果你不想整个页面重新加载,可以使用一个UpdatePanel:

    <asp:ScriptManager ID="ScriptManager1" runat="server" />
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:TextBox ID="TextBox1" runat="server" AutoPostBack="true" 
                            OnTextChanged="TextBox1_TextChanged" />
        </ContentTemplate>
    </asp:UpdatePanel>

函数 TextBox1_TextChanged 然后可以对文本执行某些操作(服务器端)。


仅限翻译文本:出于兴趣 - UpdatePanel 如何阻止整个页面的重新加载? - Kamal
@Kamal... 它并不会。更新面板对于防止整个页面在服务器上加载没有任何作用。基本上发生的是,在客户端使用 XmlHttpRequest 执行回发,然后除了 UpdatePanel 的内容之外的所有内容都被丢弃并返回。它减轻了正常回发的“闪烁”,但在服务器上并没有节省任何处理时间。 - Josh
5
它重新加载整个页面,但只发送更新面板的HTML和一些JavaScript以更新响应内容。响应比下载整个页面要小得多,浏览器无需重新呈现页面。这可以稍微加快进程,用户不会注意到任何闪烁,体验也更加流畅。 - Willem
当我按下Tab键时,文本框失去了焦点,但仍然没有触发onchange事件。 - C Sharper
我已经在使用UpdatePanel了,只是忘记了OnTextChanged。我喜欢这个答案。+1 - RustyH
谢谢,这个方法很有效。但是我还有另一个控件,它也会插入到我的文本框中,而这种技术对它不起作用。在这种情况下,我只需添加一个未连接任何内容的 asp:Button,“预览文本”,它只会导致回发(我想)。它们似乎一起涵盖了所有基础。 - Zeek2

4
if (!Page.IsPostBack)
    {
        txtName.Attributes.Add("onblur","alert('Hello world')");
    }

2
为什么不使用它。失去焦点与以下内容相同:
OnTextChanged="TextBox_TextChanged"

1
但是如果你的值没有改变呢?那就不起作用了。 - Dima Grigoriev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接