Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[C#/Flash] PostBack na klikken FlashButton

Pagina: 1
Acties:

  • T-Blizzard
  • Registratie: Juni 2001
  • Laatst online: 11-11 14:46
Ik zit al een paar dagen te worstelen met een probleem waar ik van denk dat het gewoon MOET kunnen :)

De situatie: Ik heb een ListView control met in de ItemTemplate een LinkButton waarbinnen een SWF object (CustomControl) geembed wordt.

C#:
1
2
3
4
5
6
7
8
9
<asp:LinkButton ID="cmdAddToCart" runat="server" CommandName="AddToCart" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "ID") %>'>
    <asp:Panel ID="pnlItem" runat="server" CssClass="item">
        <Flash:SWFObject ID="swfObjectProduct" runat="server" Width="120" Height="90" FlashVersion="8" WMode="transparent" Movie="~/flash/Product.swf">
            <Flash:SWFParameter ID="SWFParameterFullScreen" Name="allowFullScreen" Value="true" runat="server" />
            <Flash:SWFVariable ID="SWFVarProductName" Name="Name" Value='<%# DataBinder.Eval(Container.DataItem, "Name") %>' runat="server" />
        </Flash:SWFObject>
    </asp:Panel>
    <asp:Label ID="lbDesciption" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Description") %>'></asp:Label>
</asp:LinkButton>


Zoals te zien is zorgt dit er voor dat het de hele area clickable is :) (en ik het item kan toevoegen aan de Cart).
Behalve natuurlijk het Flash object... En daar zit het probleem dus, ik wil zorgen dat klikken op de flashbutton dezelfde postback doet als de linkButton. Ik ben geen Flashexpert maar het is mij al duidelijk dat ik met ExternalInterface javascript kan aanroepen. Maar ik ben nu al dagen met allerlei Javascript functies aan het stoeien maar ik kan maar niet iets vinden wat daadwerkelijk werkt...
Ik wil dus op een of andere manier de __doPostBack aanroepen in de Flash... Zodat het item toegevoegd wordt aan de Cart.

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Flash is in geen enkele browser onderdeel van de html. Het object wordt wel gerenderd, maar een alle browser events worden doorgelinkt naar het flash object.

Je zult dus in de flash applicatie javascript __doPostback() functie moeten aanroepen. Echter is het waarschijnlijk eenvoudiger als je niet probeert een postback te doen, maar gewoon vanuit de flash zelf een request uitvoert. Een soort van ajax implementatie in de flash dus.

Ik weet niet met welke versie van het framework je bezig met, maar het 3.5 framework heeft verregaande ajax support en deze functionaliteit kun je ook hergebruiken in een flash.

Je kunt het ook op een wat meer low-level manier oppakken door een cart.ashx?Action=AddArticle&ProductID=45 aan te roepen welke vervolgens een XML terug geven welke het vernieuwde winkelmandje representeerd.

Als je toch __doPostback wilt aanroepen is het meestal voldoende om als eerste parameter het WebControl.ClientID te gebruiken, de tweede parameter kan in de meeste gevallen leeg worden gelaten.

If it isn't broken, fix it until it is..


  • T-Blizzard
  • Registratie: Juni 2001
  • Laatst online: 11-11 14:46
Niemand_Anders schreef op dinsdag 15 juli 2008 @ 16:41:
Flash is in geen enkele browser onderdeel van de html. Het object wordt wel gerenderd, maar een alle browser events worden doorgelinkt naar het flash object.

Je zult dus in de flash applicatie javascript __doPostback() functie moeten aanroepen. Echter is het waarschijnlijk eenvoudiger als je niet probeert een postback te doen, maar gewoon vanuit de flash zelf een request uitvoert. Een soort van ajax implementatie in de flash dus.

Ik weet niet met welke versie van het framework je bezig met, maar het 3.5 framework heeft verregaande ajax support en deze functionaliteit kun je ook hergebruiken in een flash.

Je kunt het ook op een wat meer low-level manier oppakken door een cart.ashx?Action=AddArticle&ProductID=45 aan te roepen welke vervolgens een XML terug geven welke het vernieuwde winkelmandje representeerd.

Als je toch __doPostback wilt aanroepen is het meestal voldoende om als eerste parameter het WebControl.ClientID te gebruiken, de tweede parameter kan in de meeste gevallen leeg worden gelaten.
Sorry voor de wat trage reply :+

Ik ben inmiddels al wat verder... om te testen heb ik aan de ItemTemplate een nieuwe Button toegevoegd:

C#:
1
<asp:Button ID="btnAdd" runat="server" Text="+" />


In de ItemDatabound van de ListView zoek ik hierna de Button op met FindControl
en voeg de GetPostBackEventReference naar cmd. (cmd is een LinkButton met een EventHandler die de items toevoegd aan de Cart de ListView rebind enz enz).

C#:
1
2
3
Button btnAdd = (Button)e.Item.FindControl("btnAdd");
string js = Page.ClientScript.GetPostBackEventReference(cmd, "");
btnAdd.OnClientClick = js;


Als ik dan de html source bekijk komen de javascript functies van de LinkButton en de Button overeen, als ik een breakpoint in de EventHandler van de LinkButton zet en op de Button klik wordt deze aangeroepen :) en het juiste CommandArgument gaat ook mee :) Tot zo ver gaat alles goed. Enigste wat fout lijkt te gaan is dat de pagina niet gerefreshed wordt zeg maar ;) Ik blijf de oude items zien en als ik dan de pagina opnieuw oproep, is het item wel daadwerkelijk in mijn mandje terecht gekomen... What Am I Missing...

  • BlackIce
  • Registratie: Oktober 2003
  • Laatst online: 15-11 10:36
Probeer eens verschillende browsers, refreshen met de huidige pagina gaat niet altijd even goed in IE (en anderen ook eigenlijk) ivm cache.

[ Voor 10% gewijzigd door BlackIce op 18-07-2008 10:48 ]


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Kan het zijn dat je het mandje al opbouwd voordat het product daadwerkelijk is toegevoegd. In classic ASP werden vaak voor (zoals een topleft.asp) en na de content includes gebruikt om de layout om de content te presenteren. Echter als de topleft echter een mandje bevatte, dan werkt dus de linkerkant al gerenderd voordat de code van de page zelf was verwerkt.

Dit werd vaak opgelost met een addproduct.asp welke je terug redirecte waar je vandaan kwam.

Maar als je de producten in een flash toont, waarom toon je het mandje dan ook niet in die flash?

If it isn't broken, fix it until it is..