可以找到关于回发机制如何工作的非常详细的解释here。
在ASP.NET中,控件通常包含许多事件。例如,LinkButton类有Click
个事件。
以下代码:
<asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click" Text="LinkButton" />
在客户端转换为此内容:
<a id="LinkButton1" href="javascript:__doPostBack('LinkButton1','')">LinkButton</a>
如您所见,客户端的代码并未指定要触发的事件或事件处理程序。
所以我的问题是,服务器如何知道它应该触发Click
事件和LinkButton1_Click
事件处理程序,如果它从客户端收到的唯一内容是组件的ID( __doPostBack
方法的第一个参数??
如果我希望组件触发与Click
不同的事件怎么办?
答案 0 :(得分:1)
ASP.NET Web窗体始终创建一个包含页面中所有控件的表单。每当用户单击页面中触发服务器中事件的控件时,幕后发生的事情就是表单正在发布到服务器。该帖子不是进行简单的POST,而是由客户端__doPostback
函数完成,该函数接收两个参数:eventTarget
和eventArgument
。第一个具有触发回发的控件的ID,第二个包含任何额外的信息。这些参数的vañlues被复制到表单中的两个隐藏字段,这些字段与表单控件的其余部分一起发布
进入服务器后,可以读取此控件中的值以确定要引发的事件。访问Request["__EVENTTARGET"];
和Request["__EVENTARGUMENT"];
您可以阅读此SO Q&amp; A以及链接的网页,以了解有关它的更多信息:How to use __doPostBack()
ASP.NET框架通过检查这些值并查找ID与__EVENTTARGET
匹配的控件来简化工作,并实现IPostBackEventHandler。要了解有关此内容的更多信息,请阅读:Server Event Handling in ASP.NET Web Forms Pagess。
除了回发事件外,还有“变更事件”。通过比较控件的原始值(发送到浏览器时)和该控件中发布的值来引发此事件。例如,TextBox
有TextChanged
个事件。要确定事件是否必须触发,服务器将从视图状态(发送到浏览器的隐藏字段,所有已删除控件的状态,包括其值)中提取控件的原始值,并将其与已发布的值,必要时触发事件。与IPostBackEventHandler
类似,实现IPostBackDataHandler将允许框架查找需要处理此类事件的控件。
您还应了解页面生命周期,以了解服务器中发生的情况以及顺序:When to wire up event handlers asp.net
答案 1 :(得分:0)
我要给出的例子对于任何实际目的都没用,但是,你没有表明任何实际目的,所以我认为这是一个公平的游戏。我希望它会向您展示这种方法,然后您就可以根据自己的需要修改和扩展它。
public class LinkButtonWithClack : LinkButton
{
private const string ClackMarker = "Clack";
public bool ClackMode { get; set; }
protected override PostBackOptions GetPostBackOptions()
{
var options = base.GetPostBackOptions();
if (ClackMode)
{
// That's how you specify the event argument for __EVENTARGUMENT
options.Argument = ClackMarker;
}
return options;
}
public event EventHandler Clack;
protected override void RaisePostBackEvent(string eventArgument)
{
if (eventArgument == ClackMarker)
{
this.OnClack(EventArgs.Empty);
}
else
{
base.RaisePostBackEvent(eventArgument);
}
}
protected virtual void OnClack(EventArgs e)
{
if (Clack != null)
{
Clack(this, e);
}
}
}
在此示例中,您将创建一个新的服务器控件LinkButtonWithClack
。此控件继承自LinkButton
服务器控件,并具有其他事件Clack
。如果将属性ClackMode
设置为true,它将开始生成Clacks而不是Clicks。
是否通过第二个参数向doPostBack
传达了点击或咔嗒声的事件:
<a id="MainContent_LinkButtonWithClack1"
href="javascript:__doPostBack('ctl00$MainContent$LinkButtonWithClack1','Clack')">
然后服务器检查它的内容,如果它看到“Clack”,则调用Clack
事件。
当然你不可能从LinkButton
派生出来,我只是以它为例,因为你做到了。您可能会从头开始实现服务器控件。这样做时,请将您的所有知识带入服务器控件创建,或者如果您没有服务器控件,请阅读 - 您将需要它。
作为旁注,今天使用asp.net mvc比使用webforms更容易找到帮助,因为后者更老,人们使用它的人越来越少。如果你对技术选择有任何发言权我几乎可以选择asp.net mvc over webforms。