asp:заместител съдържание към низ

Прост въпрос, но не мога да намеря нищо в него, възможно ли е съдържанието на asp:placeholder да се получи в низ? Това би било чудесно да се направи от страна на сървъра, ако е възможно.

Лука


person Luke Wilkinson    schedule 14.01.2013    source източник
comment
Какво означава съдържание на asp:placeholder към низ? Искате ли генерирания html или искате текстовото съдържание на контейнер от страна на сървъра?   -  person Tim Schmelter    schedule 14.01.2013


Отговори (2)


Ако просто искате текстовото съдържание на контейнер:

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

Връща "Hello World" за:

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

Ако искате също така да получите html на изобразената контрола (и всички нейни дъщерни контроли):

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

За този aspx (GridView е свързан с данни с някои примерни данни):

<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>

ще се генерира този html (зависи от браузъра):

<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>

Имайте предвид, че трябва да промените директивата на вашата страница на

EnableEventValidation="false"

и да замени VerifyRenderingInServerForm в Page

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

при ръчно обаждане до RenderControl.

person Tim Schmelter    schedule 14.01.2013
comment
Трябва ли да добавя нещо към замяната на VerifyRenderingInServerForm, за да работи? В момента управлението на повторителя ми не работи? - person Luke Wilkinson; 15.01.2013
comment
Съжаляваме, че описанието не беше много полезно. Нищо не се изобразява в ретранслатора, поставих точка на прекъсване в зареждането на страницата на потребителския контрол, който се извиква, и не се удря. Има ли настройка в web.config, която е глобална за EnableEventValidation=false? Целият код в ascx работи и се показва, но задният c# код не се извиква? - person Luke Wilkinson; 15.01.2013

Опитайте метода RenderControl на Placeholder.

Направих нещо подобно за HyperLink, но тъй като Placeholder наследява от System.Web.UI.Control, това трябва да работи точно по същия начин. Нещо като това:

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();

Написах кратка статия по тази тема: http://www.tomot.de/en-us/article/3/asp.net/create-a-control-in-the-codebehind-and-retrieve-its-rendered-output

person citronas    schedule 14.01.2013