<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 derrière:
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();
}
}
Même le GridView est dans une balise from avec runat = "server", j'obtiens toujours cette erreur.
Des indices s'il vous plait?
runat="server"
dans sa<form>
balise). Juste une pensée ...Réponses:
Vous appelez
GridView.RenderControl(htmlTextWriter)
, donc la page lève une exception selon laquelle un contrôle serveur a été rendu en dehors d'un formulaire.Vous pouvez éviter cette exécution en remplaçant VerifyRenderingInServerForm
public override void VerifyRenderingInServerForm(Control control) { /* Confirms that an HtmlForm control is rendered for the specified ASP.NET server control at run time. */ }
Voir ici et ici .
la source
Une alternative à la substitution de VerifyRenderingInServerForm consiste à supprimer la grille de la collection de contrôles pendant que vous effectuez le rendu, puis à la rajouter lorsque vous avez terminé avant le chargement de la page. Ceci est utile si vous souhaitez avoir une méthode d'assistance générique pour obtenir le code HTML de la grille, car vous n'avez pas à vous rappeler d'ajouter le remplacement.
Control parent = grid.Parent; int GridIndex = 0; if (parent != null) { GridIndex = parent.Controls.IndexOf(grid); parent.Controls.Remove(grid); } grid.RenderControl(hw); if (parent != null) { parent.Controls.AddAt(GridIndex, grid); }
Une autre alternative pour éviter le remplacement est de faire ceci:
grid.RenderBeginTag(hw); grid.HeaderRow.RenderControl(hw); foreach (GridViewRow row in grid.Rows) { row.RenderControl(hw); } grid.FooterRow.RenderControl(hw); grid.RenderEndTag(hw);
la source
Juste après votre Page Load, ajoutez ceci:
public override void VerifyRenderingInServerForm(Control control) { //base.VerifyRenderingInServerForm(control); }
Notez que je ne fais rien dans la fonction.
EDIT: Tim a répondu à la même chose. :) Vous pouvez également trouver la réponse ici
la source
Je veux juste ajouter une autre façon de faire cela. J'ai vu plusieurs personnes sur divers threads connexes vous demander si vous pouvez utiliser VerifyRenderingInServerForm sans l'ajouter à la page parent.
En fait, vous pouvez le faire, mais c'est un peu bizarre.
Commencez par créer une nouvelle classe Page qui ressemble à ceci:
public partial class NoRenderPage : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } public override void VerifyRenderingInServerForm(Control control) { //Allows for printing } public override bool EnableEventValidation { get { return false; } set { /*Do nothing*/ } } }
N'a pas besoin d'avoir un .ASPX associé.
Ensuite, dans le contrôle que vous souhaitez rendre, vous pouvez faire quelque chose comme ce qui suit.
StringWriter tw = new StringWriter(); HtmlTextWriter hw = new HtmlTextWriter(tw); var page = new NoRenderPage(); page.DesignerInitialize(); var form = new HtmlForm(); page.Controls.Add(form); form.Controls.Add(pnl); controlToRender.RenderControl(hw);
Votre contrôle d'origine est maintenant rendu au format HTML. Si vous en avez besoin, remettez le contrôle dans sa position d'origine. Vous avez maintenant le HTML rendu, la page comme d'habitude et aucune modification de la page elle-même.
la source
HttpContext.Current.Server.Execute(page, writer, false);
pour écrire le HTML - l'appelcontrolToRender.RenderControl(hw);
n'a déclenché aucun des événements de contrôle, par exemplePage_Load
, pendant le rendu du contrôle, il était vide.Voici mon code
protected void btnExcel_Click(object sender, ImageClickEventArgs e) { if (gvDetail.Rows.Count > 0) { System.IO.StringWriter stringWrite1 = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter htmlWrite1 = new HtmlTextWriter(stringWrite1); gvDetail.RenderControl(htmlWrite1); gvDetail.AllowPaging = false; Search(); sh.ExportToExcel(gvDetail, "Report"); } } public override void VerifyRenderingInServerForm(Control control) { /* Confirms that an HtmlForm control is rendered for the specified ASP.NET server control at run time. */ }
la source