Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#] Webcontrol renderen buiten <form></form> tags

Pagina: 1
Acties:

  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 15-03 08:21
Stel ik heb de volgende opbouw van een asp.net pagina:

HTML:
1
2
3
4
5
6
7
8
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server"></head>
<body>
    <form id="form1" runat="server">
        <custom:control id="customcontrol1" runat="server" />
    </form>
</body>
</html>


Deze custom control moet er voor zorgen dat er een 2e form aan m'n body wordt toegevoegd, zodat het geheel er clientside als volgt uit komt te zien:

HTML:
1
2
3
4
5
6
7
8
9
10
11
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server"></head>
<body>
    <form name="form1" method="post" action="page.aspx" id="form1">
        ...
    </form>
    <form name="form2">
        ...
    </form>
</body>
</html>


Het probleem waar ik tegenaanloop is dat ik vanuit de custom control alleen toegang heb tot het gebied binnen Form1. Als ik de HtmlTextWriter uit de Render method pak bijv. kan ik alleen HTML code genereren die direct op de plaats van het custom control in Form1 terecht komt. Ook als ik bijv Page.Form gebruik, kom ik niet verder dan Form1. Ik moet als het ware een niveau omhoog, vanuit mijn custom control gezien.

Page.Body bestaat niet ;(

Een alternatief is het overriden van de Render method van de page zelf, dus een StringWriter pakken.. de base.Render naar de StringWriter laten schrijven, vervolgens met wat kunst en vliegwerk er zelf een Form bij plakken en het resultaat naar de writer van de override sturen. Probleem daarbij is dat ik logica die bij die custom control hoort, uit het control trek. Dat is geen optie.

Er zijn nog meer van dat soort alternatieven, zoals het gebruik van de global.asax of een literal control vlak na de </form> tag, maar daarvoor geldt hetzelfde.

Een eis is dat alle logica binnen het custom control verwerkt zit. Ik heb dus een normale pagina, sleur/pleur daar het control op en voila... clientside een extra form tag ;) Zonder dat hiervoor per pagina nog zaken aangepast moeten worden.

Iemand enig idee hoe ik dit voor elkaar zou kunnen krijgen ?

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
Volgens mij is het sowieso een kansloze exercitie om te proberen 2 forms binnen ASP.NET te krijgen. Zelfs als je het handmatig doet, dus niet vanuit een UserControl, vind ASP.NET dit niet heel grappig. Tenminste, als allebei runat=server moet zijn.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Inderdaad. Ik weet niet of het anders is in Asp.net 2, maar in Asp.net 1 kun je maar 1 runat=server form hebben.

https://niels.nu


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 11:16

mulder

ik spuug op het trottoir

Dan volgt automagisch de vraag waarom je 2 forms wilt.

oogjes open, snaveltjes dicht


  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 13:38

sopsop

[v] [;,,;] [v]

Hydra schreef op woensdag 27 februari 2008 @ 16:47:
Inderdaad. Ik weet niet of het anders is in Asp.net 2, maar in Asp.net 1 kun je maar 1 runat=server form hebben.
Hij wil ook geen twee serverside forms hebben, maar 1 serverside en twee clientside. Een server side en een client side kan iig wel, maar of het ook met twee clientside forms kan weet ik niet.

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
sopsop schreef op woensdag 27 februari 2008 @ 16:50:
[...]

Hij wil ook geen twee serverside forms hebben, maar 1 serverside en twee clientside. Een server side en een client side kan iig wel, maar of het ook met twee clientside forms kan weet ik niet.
Je kunt zo veel <form></form> tags op je page hebben als je wil, punt is dat er maar 1 runat-server is, en je alleen daarbinnen asp.net controls kunt gebruiken. Je kunt in die anders forms prima HTML plakken die je al dan niet dynamisch genereert, maar dat doe je dan niet via een control maar via inline code.

Voorbeeld:
C#:
1
2
3
4
5
6
7
8
9
10
11
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server"></head>
<body>
    <form name="form1" method="post" action="page.aspx" id="form1">
       <cc1:MyControl ID="MyControl1"/>
    </form>
    <form name="form2">
       <%=GenerateFormFields();%>
    </form>
</body>
</html>

https://niels.nu


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Hydra schreef op woensdag 27 februari 2008 @ 16:57:
[...]


Je kunt zo veel <form></form> tags op je page hebben als je wil, punt is dat er maar 1 runat-server is, en je alleen daarbinnen asp.net controls kunt gebruiken. Je kunt in die anders forms prima HTML plakken die je al dan niet dynamisch genereert, maar dat doe je dan niet via een control maar via inline code.

Voorbeeld:
C#:
1
2
3
4
5
6
7
8
9
10
11
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server"></head>
<body>
    <form name="form1" method="post" action="page.aspx" id="form1">
       <cc1:MyControl ID="MyControl1"/>
    </form>
    <form name="form2">
       <%=GenerateFormFields();%>
    </form>
</body>
</html>
Dan kun je toch net zo goed je custom control buiten je form plaatsen? Dat werk net zo goed.
C#:
1
2
3
4
5
6
7
8
9
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server"></head>
<body>
    <form name="form1" method="post" action="page.aspx" id="form1">
       ... normale form rommel...
    </form>
    <cc1:MyControl ID="MyControl1"/>
</body>
</html>


@TS: Dit ga je volgens mij niet voor elkaar krijgen zonder enorm te klooien. Het wordt toch sleur,pleur, aanpassen vrees ik.

  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 15-03 08:21
ASP.NET is gebouwd op een constructie dat er maar 1 runat=server form is. Dat wil ik ook gewoon zo houden en ik hoef dus alleen clientside een extra form te hebben.

Deze in de pagina zelf erbij schrijven, of de control buiten de form tags plaatsen is geen optie. De webcontrol zit in een class lib en wordt vanuit de controls toolbox op het form gesleurd. De render methods van het control of het inhaken op de response stream oid moeten dit dus realiseren.

De reden dat er een extra form bij moet komen is omdat deze data post naar een externe service. De eigenschappen van het form zijn daarbij van belang, zoals de naam en de inhoud. Dit is iets wat door de externe partij afgedwongen wordt en daar heb ik dus geen invloed op :'(

Zou ik bijv. OnInit van het control een eventhandler kunnen knopen aan de Render method van de Page ? Ik zou dan de response HTML kunnen opvangen en hier handmatig iets bijschrijven, voordat ik het naar de browser stuur.

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

Niemand_Anders

Dat was ik niet..

Rechtstreeks klant input posten naar een derde partij.. Waar is dat dan goed voor? Je hebt totaal geen controle, validatie, error afvang of wat dan ook.

Als het niet mogelijk is om data via een WebRequest naar die derde partij te sturen, dan zou je als workaround gewoon de betreffende velden kunnen afvangen. De response daarvan levert een puur clientside form op welke zodra de html pagina is geladen automatisch het formulier alsnog submit.
Een soort van 'form' redirect pagina.

Op die manier kun je gewoon overal op je website je user controls gebruiken zonder dat je daar rare kunstgrepen moet uithalen.

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


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
Werkt het sowieso niet ook gewoon als je de form binnen het asp.net form plaatst?
update: Geloof dat het van HTML niet helemaal mag.

[ Voor 24% gewijzigd door riezebosch op 28-02-2008 10:39 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 15-03 08:21
Niemand_Anders schreef op donderdag 28 februari 2008 @ 10:00:
Rechtstreeks klant input posten naar een derde partij.. Waar is dat dan goed voor? Je hebt totaal geen controle, validatie, error afvang of wat dan ook.
Wie zegt dat ik klant input post ? De content van die form is hidden en wordt vanaf de server gerendered, via het control
Niemand_Anders schreef op donderdag 28 februari 2008 @ 10:00:
Als het niet mogelijk is om data via een WebRequest naar die derde partij te sturen, dan zou je als workaround gewoon de betreffende velden kunnen afvangen. De response daarvan levert een puur clientside form op welke zodra de html pagina is geladen automatisch het formulier alsnog submit.
Een soort van 'form' redirect pagina.
Dit stuk begrijp ik niet helemaal maar gaat volgens mij niet werken omdat het submitten van dat form niet het enige is dat gebeurd... Er zijn de nodige JS scripts ed van die externe partij die acties uitvoeren op dat form.
riezebosch schreef op donderdag 28 februari 2008 @ 10:37:
Werkt het sowieso niet ook gewoon als je de form binnen het asp.net form plaatst?
update: Geloof dat het van HTML niet helemaal mag.
Een form in een form ? Inderdaad niet echt volgens de xhtml standaard, maar misschien wel interessant om te kijken of zoiets zou kunnen werken.

[ Voor 15% gewijzigd door Mephix op 28-02-2008 10:42 ]


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

Niemand_Anders

Dat was ik niet..

Mephix schreef op donderdag 28 februari 2008 @ 10:41:
Wie zegt dat ik klant input post ? De content van die form is hidden en wordt vanaf de server gerendered, via het control
Ik begrijp dus uit jouw woorden dat het 'client-sided' formulier statisch is en dat de input van het serversided formulier wordt gebruikt om het client sided (hidden) formulier op te bouwen.
Dit stuk begrijp ik niet helemaal maar gaat volgens mij niet werken omdat het submitten van dat form niet het enige is dat gebeurd... Er zijn de nodige JS scripts ed van die externe partij die acties uitvoeren op dat form.
Volgens mij kun je gewoon nadat je de input van het serversided formulier hebt gecontroleerd gewoon een Server.TransferRequest aanroep gebruiken om dan een html page te renderen met het verborgen formulier en daarin de benodigde javascript van de derde partij opnemen? Vervolgens kun je in de body onload event de javascript functie aanroepen (van de derde partij) om het formulier te versturen.

Om de informatie beschikbaar te houden, kan het webcontrol een simpel data object
C#:
1
2
3
4
5
public class HiddenFormValues //velden opnemen welke ik het verborgen formulier moeten komen
{
  public string Username { get; set; }
  public double Amount {get; set; } 
}

in de HttpContext.items plaatsen welke de aspx welke wordt aangeroepen door TransferRequest weer uitleest.

Ik zou in elke geval geen form in een form gaan plaatsen omdat dan het gedrag van de verschillende browsers niet te voorspellen is.

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

Pagina: 1