It's monday and now I can see the answer! :-)

The RenderChildren should be aware of RenderMethod. So, for a Form control
the RenderChildren should be something like:

output.WriteBeginTag(etc);
output.WriteAttrs(etc);
invoke delegate;
output.WriteEndTag(etc);

Pretty simple.


hammett
MCAD

----- Original Message -----
From: "hammett" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Friday, July 04, 2003 6:08 PM
Subject: [ADVANCED-DOTNET] Asp.net RenderMethod magic


> (I'm posting this question here cause I think it is an advanced issue)
>
> For whose who don't know, when you add code inside some runat="server"
tag,
> the control receives a delegate (a RenderMethod delegate to be more
> precise). The control should not render in it's normal way as it should
> first check if someone provided a RenderMethod delegate before rendering.
>
> To know how things work I subclassed a HtmlGenericControl and added some
> code contents, like this:
>
>   <form id="Form1" method="post" runat="server">
>    <www:webcustomcontrol1 runat="server" id="cont">
>     <% = "hello" %>
>     <p>&nbsp;</p>
>     <INPUT type="button" value="Button">
>    </www:webcustomcontrol1>
>   </form>
>
> (the control should render itself as a SPAN tag). ASP.Net generated the
> usual method for the delegate:
>
> private void __Rendercont(System.Web.UI.HtmlTextWriter __output,
> System.Web.UI.Control parameterContainer)
> {
>     __output.Write("\r\n\t\t\t\t");
>     __output.Write("hello");
>     __output.Write("\r\n\t\t\t\t<p>&nbsp;</p>\r\n\t\t\t\t<INPUT
> type=\"button\" value=\"Button\"  />\r\n\t\t\t");
> }
>
> So far, so good. As the Page's render begins, it calls the public
> RenderControl(output) method that should call RenderChildren and
recursively
> render all controls.
>
> But, wait! How things should work when they reach my control?
>
> My-brain output begins:
>
>   The recursive call into RenderControl of my control begins
>   The control have a render delegate, so invoke it
>   ASP.Net generated render method is called
>   Render finished for the control (every child control should be handled
in
> the render method)
>
> End of my-brain output
>
> I'm believer that it is the way rendering works for controls with render
> methods hidden by render delegates. But, I notice something strage. Where
is
> the call to the control render method? In this case it should render a
SPAN
> tag - and it does! - but where? And if someone provide (override) the
render
> method and write something like:
>
> protected override void Render(HtmlTextWriter output)
> {
>  output.WriteBeginTag... etc
>  output.WriteSomethingElse etc
>  output.WriteEndTag...
> }
>
> Where's the render method fits? Nowhere, I think.
>
>
> Well, it's friday. Maybe the answer is jumping in front of me right now,
but
> I can't see it - maybe the answer is the RenderChildren... Any thoughts?
>
>
> Regards,
>
> hammett
> MCAD
>

Reply via email to