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






4.83/5 (42投票s)
这是一个简短的代码片段,旨在帮助您了解 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
事件只是将值存储在两个隐藏字段中。eventTarget
- 触发回发的控件的名称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 日 - 发布文章
参考
PostBack
的技术定义 - Peter A. Bromberg 的文章