<form runat="server" id="f1">
<div runat="server" id="d">
grid view:
<asp:GridView runat="server" ID="g">
</asp:GridView>
</div>
<asp:TextBox runat="server" ID="t" TextMode="MultiLine" Rows="20" Columns="50"></asp:TextBox>
</form>
Code dahinter:
public partial class ScriptTest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
g.DataSource = new string[] { "a", "b", "c" };
g.DataBind();
TextWriter tw = new StringWriter();
HtmlTextWriter h = new HtmlTextWriter(tw);
d.RenderControl(h);
t.Text = tw.ToString();
}
}
Sogar die GridView befindet sich in einem from-Tag mit runat = "server", dennoch wird dieser Fehler angezeigt.
Irgendwelche Hinweise bitte?
runat="server"
in seinem<form>
Tag deklariert ist oder nicht ). Nur ein Gedanke ...Antworten:
Sie rufen an
GridView.RenderControl(htmlTextWriter)
, daher löst die Seite eine Ausnahme aus, dass ein Server-Control außerhalb eines Formulars gerendert wurde.Sie könnten diese execption vermeiden durch zwingende VerifyRenderingInServerForm
Sehen Sie hier und hier .
quelle
Eine Alternative zum Überschreiben von VerifyRenderingInServerForm besteht darin, das Raster während des Renderns aus der Steuerelementauflistung zu entfernen und es dann wieder hinzuzufügen, wenn Sie fertig sind, bevor die Seite geladen wird. Dies ist hilfreich, wenn Sie eine generische Hilfsmethode zum Abrufen von Grid-HTML benötigen, da Sie nicht daran denken müssen, die Überschreibung hinzuzufügen.
Eine andere Alternative, um das Überschreiben zu vermeiden, besteht darin, Folgendes zu tun:
quelle
Fügen Sie direkt nach Ihrem Page Load Folgendes hinzu:
Beachten Sie, dass ich in der Funktion nichts mache.
EDIT: Tim antwortete das gleiche. :) Sie können auch die Antwort finden hier
quelle
Ich möchte nur eine andere Möglichkeit hinzufügen, dies zu tun. Ich habe mehrere Personen in verschiedenen verwandten Threads gesehen, die gefragt haben, ob Sie VerifyRenderingInServerForm verwenden können, ohne es der übergeordneten Seite hinzuzufügen.
Sie können dies tatsächlich tun, aber es ist ein bisschen bodge.
Erstellen Sie zunächst eine neue Seitenklasse, die ungefähr so aussieht:
Es muss keine .ASPX zugeordnet sein.
Dann können Sie in dem Steuerelement, das Sie rendern möchten, Folgendes tun.
Jetzt haben Sie Ihr ursprüngliches Steuerelement als HTML gerendert. Wenn nötig, fügen Sie das Steuerelement wieder in seine ursprüngliche Position ein. Sie haben jetzt den HTML-Code gerendert, die Seite wie gewohnt und keine Änderungen an der Seite selbst vorgenommen.
quelle
HttpContext.Current.Server.Execute(page, writer, false);
, um den HTML-Code zu schreiben. Der AufrufcontrolToRender.RenderControl(hw);
hat keines der Steuerelementereignisse ausgelöst, z. B.Page_Load
während das Steuerelement gerendert wurde, war es leer.Hier ist mein Code
quelle