65.9K
CodeProject 正在变化。 阅读更多。
Home

了解哪个控件引发了 PostBack 的方法

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (42投票s)

2010 年 12 月 8 日

CPOL

2分钟阅读

viewsIcon

190846

downloadIcon

568

这是一个简短的代码片段,旨在帮助您了解 ASP.NET 中的回发 (PostBack) 是什么,以及如何使用 ASP.NET 内置功能和手动方式来了解哪个控件触发了回发。

引言

本文的主要目的是让您了解在 ASP.NET 页面中存在的多个控件中,在发生 PostBack 时,如何知道哪个控件实际触发了此事件。

背景

关于回发的技术定义:大多数 ASP.NET 控件都是“服务器控件”。 这意味着当发生操作时,承载所有控件的页面在 <FORM... 标签内,会进行一个常规的 HTTP POST 请求,目标 URL 是页面本身。 这被称为“POSTBACK”。 *

简单来说,我们可以这样区分 PostBack 和重定向。

回发 (Postback):ASP.NET 页面重定向到自身的情况。

重定向 (Redirect):ASP.NET 页面从另一个页面调用。

您可以使用 IsPostBack 属性在代码中检查页面是否已 PostedBack,该属性返回 Bool 类型的值。

Using the Code

本文的目的是确定页面中哪个控件导致页面回发到自身,或者换句话说,哪个控件触发了 PostBack

对于支持 AutoPostBack 属性的控件,ASP.NET 页面有一个内置函数,可以确定触发事件的控件。

有几个控件支持 AutoPostBack,其中一些是:

  • 下拉列表
  • CheckBoxList
  • RadioButtonList
  • TextBox 等。

这些控件在 ASP.NET 自动生成的 JavaScript 中调用 _doPostback 函数。

让我们来看看 _doPostback 函数。

function __doPostBack(eventTarget, eventArgument) {
            if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
                theForm.__EVENTTARGET.value = eventTarget;
                theForm.__EVENTARGUMENT.value = eventArgument;
                theForm.submit();
            }
        }

注意

  • 只有当页面中至少有一个控件触发 AutoPostBack 时,此函数才会可见。
  • _doPostBack 事件只是将值存储在两个隐藏字段中。
    1. eventTarget - 触发回发的控件的名称
    2. eventArgument - 要发送到服务器的参数

让我们看看这两个隐藏字段在页面上是什么样子的。

<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />

现在,如果您想从代码中获取触发控件的 ID,您可以编写这个简单的代码片段并找到存储在隐藏字段中的值

if (IsPostBack)
{
    string ControlID = string.Empty;
    if (!String.IsNullOrEmpty(Request.Form["__EVENTTARGET"]))
    {
        ControlID = Request.Form["__EVENTTARGET"];
    }
}

或者,您可以使用以下方法找到完整的控件对象

if (IsPostBack)
{
    string ControlID = string.Empty;
    if (!String.IsNullOrEmpty(Request.Form["__EVENTTARGET"]))
    {
        ControlID = Page.Request.Params["__EVENTTARGET"];
        Control postbackControl = Page.FindControl(ControlID);
    }
}

_doPostBack 函数仅由支持 AutoPostBack 属性的 Controls 调用,现在让我们看看其他不支持内置函数的 Control

可以列出的控件有:

  • Button
  • ImageButton 等。

为了为不支持 AutopostBack 属性的控件创建一个功能,请在页面上创建一个隐藏字段。

<asp:HiddenField ID="CustomHiddenField" runat="server" />

clientclick 上调用一个自定义 Js 函数,以便在页面实际重定向到服务器之前将其存储在隐藏字段中。

<asp:Button ID="btn" runat="server" Text="Click me"
  OnClientClick = "SetSource(this.id)" />

function SetSource(SourceID)
    {
        var hidSourceID =
        document.getElementById("<%=CustomHiddenField.ClientID%>");
        hidSourceID.value = SourceID;
    }

注意: 始终使用 "<%=CustomHiddenField.ClientID%>" 约定,因为 Hiddenfield ID 可以被 ASP.NET 重命名。

并在页面由服务器回发后使用 Codebehind 获取名称。

if (IsPostBack)
{
    string CtrlID = string.Empty;
    if (!String.IsNullOrEmpty(Request.Form[CustomHiddenField.UniqueID]))
    {
        CtrlID = Request.Form[CustomHiddenField.UniqueID];
    }
}

现在下面是完整的代码片段,用于获取两种类型的控件中触发回发的控件。

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        string ControlID = string.Empty;
        if (!String.IsNullOrEmpty(Request.Form["__EVENTTARGET"]))
        {
            ControlID = Request.Form["__EVENTTARGET"];
        }
        else
        {
            //Buttons and ImageButtons
            if (!String.IsNullOrEmpty(Request.Form[CustomHiddenField.UniqueID]))
            {
                ControlID = Request.Form[CustomHiddenField.UniqueID];
            }
        }
    }
} 

历史

  • 2010 年 12 月 14 日 - 使用 IsNullOrEmpty 截断代码
  • 2010 年 12 月 9 日 - 附加代码并纠正了一些拼写错误 WTHO ThatRaja
  • 2010 年 12 月 8 日 - 发布文章

参考

© . All rights reserved.