是否可以指定要开火的事件?

时间:2015-09-29 07:33:08

标签: javascript asp.net events webforms

可以找到关于回发机制如何工作的非常详细的解释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不同的事件怎么办?

2 个答案:

答案 0 :(得分:1)

ASP.NET Web窗体始终创建一个包含页面中所有控件的表单。每当用户单击页面中触发服务器中事件的控件时,幕后发生的事情就是表单正在发布到服务器。该帖子不是进行简单的POST,而是由客户端__doPostback函数完成,该函数接收两个参数:eventTargeteventArgument。第一个具有触发回发的控件的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

除了回发事件外,还有“变更事件”。通过比较控件的原始值(发送到浏览器时)和该控件中发布的值来引发此事件。例如,TextBoxTextChanged个事件。要确定事件是否必须触发,服务器将从视图状态(发送到浏览器的隐藏字段,所有已删除控件的状态,包括其值)中提取控件的原始值,并将其与已发布的值,必要时触发事件。与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(&#39;ctl00$MainContent$LinkButtonWithClack1&#39;,&#39;Clack&#39;)">
然后

服务器检查它的内容,如果它看到“Clack”,则调用Clack事件。

当然你不可能从LinkButton派生出来,我只是以它为例,因为你做到了。您可能会从头开始实现服务器控件。这样做时,请将您的所有知识带入服务器控件创建,或者如果您没有服务器控件,请阅读 - 您将需要它。

作为旁注,今天使用asp.net mvc比使用webforms更容易找到帮助,因为后者更老,人们使用它的人越来越少。如果你对技术选择有任何发言权我几乎可以选择asp.net mvc over webforms。