<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>
Código detrás:
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();
}
}
Incluso GridView está dentro de una etiqueta from con runat = "server", todavía recibo este error.
¿Alguna pista por favor?
runat="server"
en su<form>
etiqueta). Solo un pensamiento ...Respuestas:
Está llamando
GridView.RenderControl(htmlTextWriter)
, por lo tanto, la página genera una excepción de que un Control de servidor se procesó fuera de un formulario.Puede evitar esta excepción anulando VerifyRenderingInServerForm
public override void VerifyRenderingInServerForm(Control control) { /* Confirms that an HtmlForm control is rendered for the specified ASP.NET server control at run time. */ }
Vea aquí y aquí .
fuente
Una alternativa a la invalidación de VerifyRenderingInServerForm es eliminar la cuadrícula de la colección de controles mientras realiza el renderizado y luego volver a agregarla cuando haya terminado antes de que se cargue la página. Esto es útil si desea tener algún método auxiliar genérico para obtener grid html porque no tiene que acordarse de agregar la anulación.
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); }
Otra alternativa para evitar la anulación es hacer esto:
grid.RenderBeginTag(hw); grid.HeaderRow.RenderControl(hw); foreach (GridViewRow row in grid.Rows) { row.RenderControl(hw); } grid.FooterRow.RenderControl(hw); grid.RenderEndTag(hw);
fuente
Justo después de su Page_Load agregue esto:
public override void VerifyRenderingInServerForm(Control control) { //base.VerifyRenderingInServerForm(control); }
Tenga en cuenta que no hago nada en la función.
EDITAR: Tim respondió lo mismo. :) También puedes encontrar la respuesta aquí
fuente
Solo quiero agregar otra forma de hacer esto. He visto a varias personas en varios hilos relacionados preguntar si puede usar VerifyRenderingInServerForm sin agregarlo a la página principal.
De hecho, puedes hacer esto, pero es un poco complicado.
Primero, cree una nueva clase Page que se parezca a lo siguiente:
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*/ } } }
No necesita tener un .ASPX asociado.
Luego, en el control que desea renderizar, puede hacer algo como lo siguiente.
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);
Ahora tienes tu control original renderizado como HTML. Si es necesario, vuelva a colocar el control en su posición original. Ahora tiene el HTML renderizado, la página con normalidad y sin cambios en la página en sí.
fuente
HttpContext.Current.Server.Execute(page, writer, false);
para escribir el HTML: la llamadacontrolToRender.RenderControl(hw);
no generó ninguno de los eventos de control, por ejemplo,Page_Load
así que mientras el control se estaba procesando, estaba vacío.Aquí está mi código
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. */ }
fuente