asp:placeholder contents to string

Simple question but I can’t find anything on it, is it possible to get the contents of an asp:placeholder to a string? This would be great to do server side if it is possible.

Luke

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

If you just want the textual content of a placeholder:

string textualContent = ((LiteralControl) PlaceHolder1.Controls[0]).Text;

Returns
"Hello World"
for:

<asp:PlaceHolder ID="PlaceHolder1" runat="server">Hello World</asp:PlaceHolder>

If you also want to get the html of the rendered control (and all of it’s child-controls):

System.IO.TextWriter tw = new System.IO.StringWriter();
HtmlTextWriter h = new HtmlTextWriter(tw);
PlaceHolder1.RenderControl(h);
string html = tw.ToString();

For this aspx (the GridView is databound with some sameple data):

<asp:PlaceHolder ID="PlaceHolder1" runat="server">
    <asp:Label ID="LblTest" runat="server">Test-Label</asp:Label>
    <asp:TextBox ID="TxtTest" runat="server" Text="Foo"></asp:TextBox>
    <asp:GridView runat="server" ID="GridView1"></asp:GridView>
    <textarea name="TextArea1" rows="2" cols="1">
    First line
    Second line
    </textarea>
</asp:PlaceHolder>

this html will be generated (depends on the browser):

<span id="MainContent_LblTest">Test-Label</span><input name="ctl00$MainContent$TxtTest" type="text" value="Foo" id="MainContent_TxtTest" /><div>
    <table cellspacing="0" rules="all" border="1" id="MainContent_GridView1" style="border-collapse:collapse;">
        <tr>
            <th scope="col">ID</th><th scope="col">Text</th>
        </tr><tr>
            <td>1</td><td>Row #1</td>
        </tr><tr>
            <td>2</td><td>Row #2</td>
        </tr><tr>
            <td>3</td><td>Row #3</td>
        </tr><tr>
            <td>4</td><td>Row #4</td>
        </tr><tr>
            <td>5</td><td>Row #5</td>
        </tr>
    </table>
</div>
    <textarea name="TextArea1" rows="2" cols="1">
    First line
    Second line
    </textarea>

Note that you need to change your page directive to

EnableEventValidation="false"

and to override VerifyRenderingInServerForm in the Page

public override void VerifyRenderingInServerForm(Control control)
{
    /* Confirms that an HtmlForm control is rendered for the specified ASP.NET
       server control at run time. */
}

when calling RenderControl manually.

Method 2

Try the RenderControl method of the Placeholder.

I did something like this for a HyperLink, but as a Placeholder inherits from System.Web.UI.Control, that should work exactly the same. Something like this:

StringBuilder sb = new System.Text.StringBuilder();
using (var stringWriter = new System.IO.StringWriter(sb))
{
    using (var htmlTextWriter = new System.Web.UI.HtmlTextWriter(stringWriter))
    {
        YourPlaceHolder.RenderControl(htmlTextWriter);
    }
}
return sb.ToString();

I’ve written a short article about this topic: http://www.tomot.de/en-us/article/3/asp.net/create-a-control-in-the-codebehind-and-retrieve-its-rendered-output


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x