27 Stimmen

Innerer Inhalt von '' kann nicht abgerufen werden, da der Inhalt nicht literal ist

Ich versuche, den Inhalt eines Repeaters, der eine HTML-Tabelle enthält, zu iterieren und den Inhalt jeder Zelle zu verwenden. Dies funktioniert gut für Standard-HTML-Komponenten, aber explodiert, wenn ich versuche, ein Steuerelement zu verwenden. Der folgende Code druckt den Wert der ersten Zelle, "Item #1", löst aber eine HttpException aus, wenn er versucht, auf .InnerText der zweiten Zelle zuzugreifen. Der Fehler ist wie folgt:

Cannot get inner content of  because the contents are not literal.

Ich habe versucht, RenderControl über diese Lösung an anderer Stelle gefunden, die aus zwei Gründen fehlgeschlagen; 1) es gerendert die gesamte HTML der ersten Zelle und 2) es immer noch explodierte beim Versuch, die zweite Zelle mit der folgenden Meldung zugreifen:

'LinkButton1' of type 'LinkButton' must be placed inside 
 a form tag with runat=server

Gibt es eine einfache Möglichkeit, den LinkButton-Text zu erhalten, den ich suche? Repeater-Code und C# können unten gefunden werden.

Der Repeater-Code:

<asp:Repeater ID="Rep1" runat="server">
<HeaderTemplate>
    <table id="Table1" class="data">
</HeaderTemplate>
<ItemTemplate>
    <tr id="Row" runat="server">
        <td>Item #1</td>
        <td><asp:LinkButton ID="LinkButton1" OnClick="DoSomething" 
             Text="Item #2" runat="server" /></td>
    </tr>
</ItemTemplate>
<FooterTemplate>
    </table>
</FooterTemplate>

Die C#:

foreach (RepeaterItem item in Rep1.Items)
{
    HtmlTableRow row = item.Controls[0].FindControl("Row") as HtmlTableRow;

    foreach (HtmlTableCell cell in row.Cells)
    {
        if (cell.InnerText != string.Empty) 
        {
            Console.WriteLine(cell.InnerText);
        }
    }
}

28voto

katbyte Punkte 2553

Für alle anderen, die hier ankommen:

Sie können nicht bekommen InnerHtml o InnerText in einem Control es sei denn, sein Inhalt ist wörtlich, d. h. es gibt keine Server-Steuerelemente oder Steuerelemente mit runat="server" darin, die gerendert werden mussten

3voto

Jon Adams Punkte 23566

Iteration/Rekurs durch alle untergeordneten Steuerelemente in der Controls-Sammlung. Wenn Sie zu einem Blattknoten (ohne Kinder) gelangen, greifen Sie auf das Steuerelement InnerText Eigentum.

3voto

RenderControl C#

StringWriter iSW = new StringWriter();
HtmlTextWriter iHTW = new HtmlTextWriter(iSW);
iDiv.RenderControl(iHTW);
string iS = iSW.GetStringBuilder().ToString();

einbeziehen.

public override void VerifyRenderingInServerForm(Control control)
{
    return;
}

RenderControl VB

Dim iSW As New StringWriter 
Dim iHTW As New HtmlTextWriter(iSW) 
iDiv.RenderControl(iHTW) 
Dim iS As String = iSW.GetStringBuilder().ToString()

einbeziehen.

Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
    Return
End Sub

-1voto

user48192 Punkte 31

Stellen Sie außerdem sicher, dass Sie nicht versuchen, auf ein anderes Steuerelement zuzugreifen, während ein anderes Steuerelement in einem Steuerelement mit mehreren Ansichten aktiviert ist.

-2voto

Sakthi Punkte 9

String value = ((Literal)(cell.Controls[0])).Text

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X