Search code examples
asp.netasynchronousupdatepanelpostbackweb-parts

AsyncPostBackTrigger EventName - how to determine?


I'm having trouble figuring out what 'EventName' asp.net is expecting in the EventName attribute of an AsyncPostBackTrigger. (The trigger I'm looking at is the drag event on a asp.net WebPart, so if anyone knows the answer based on that, great.)

I read elsewhere that __EVENTTARGET should give me the ID of the control that triggered the event, and __EVENTARGUMENT should give me the name of the event.

To try to figure out what the trigger should be, I've added some code in my page load on postback:

Me.txtEventTarget.Value = Me.Page.Request.Params("__EVENTTARGET")
Me.txtEventArg.Value = Me.Page.Request.Params("__EVENTARGUMENT")

And when I trigger the postback, I get the following output:

txtEventTarget:
ctl00$cphDataEntry$zone2

txtEventArg:
Drag:WebPart_gwpucMyFiles:0

Looks like the 'event arguments' is actually a composite object consisting of three parts: the name of the event, what looks like part of the ID of the control triggering the event, and a value associated with the event.

But what the heck is ASP.Net doing to the IDs? I know it does annoying things with underscores and dollar signs, but why is it using a different format for these two variables? Shouldn't they both contain underscores?

When I view the html source of my page, the control ID looks more like this: "ctl00_cphDataEntry_WebPartManager1_gwpucMyFiles", except it's never just that ID; the ID of child controls are tacked on.

Anyway, when I try this it doesn't work:

<Triggers>
        <asp:AsyncPostBackTrigger ControlID="ctl00_cphDataEntry_WebPartManager1_gwpucMyFiles" EventName="Drag"/>
</Triggers>

So, does anyone know what I should put in the AsynchronousPostbackTrigger? Is the EventName simply "Drag"? If so, do I need the full ID of my control for the 'ControlID' attribute? If so, how do I determine the full ID? Should it be in dollar-sign format or underscore format?


Solution

  • The ControlID should be the the ID of the web server control. Say you have the following markup inside your ZoneTemplate:

    <uc1:MyWebPart ID="MyWebPart1" runat="server" />
    

    You only need "MyWebPart1" for the ControlID property in the AsynchronousPostbackTrigger, even though in the rendered HTML you will see pre-pended IDs of parent controls, with the dollar sign as the delimiter in the "name" attribute and an underscore as a delimiter in the "id" element.

    Neither WebPart nor WebPartZone exposes a "Drag" event, but the WebPartManager exposes the WebPartMoving event, so it seems like that's what you want to handle. Try this:

    <Triggers>
            <asp:AsyncPostBackTrigger ControlID="WebPartManager1" EventName="WebPartMoving" />
    </Triggers>
    

    I'll leave it to you to read up on handling that event and identifying which web part triggered it but see if you can at least get the partial-page postback working first.