En el post anterior vimos lo facil que es hacer uso del Control.RenderControl() para exportar nuestras paginas a un formato HTML. Sin embargo, este metodo nos va a generar errores dependiendo del uso creativo que estemos empleando.
El primero es un error que ocurrirá al intentar hacer uso del metodo que ya vimos:
RegisterForEventValidation can only be called during Render()
Al parecer el problema es que estamos rendereando un control “fuera de tiempo” para ASP.Net. Para omitir este problema habra que deshabilitar la validación de los controles para esta pagina, poniendo en el encabezado la siguiente directiva:
<%@ Page Language=”C#” AutoEventWireup=”true” enableEventValidation =”false”….
Desconozco los efectos secundarios que puede tener deshabilitar la validación de eventos para la pagina, asi que recomiendo usarlo con cuidado, y en todo caso, tratar de aislar en la medida de lo posible el control a exportar.
El segundo problema viene al tratar de exportar mas de un control. Ya encarrerados, ¿por que no meter varios controles, digamos en un asp:Panel y al final renderear este ultimo?
Bueno, pues eso es precisamente lo que estaba intentado cuando me tope con este problema:
The control must be placed inside a form tag with runat=server
Al parecer, a ASP.Net no le gusta que rendereemos controles fuera de una forma. Y de esto se encarga un metodo de las formas llamado VerifyRenderingInServerForm.
La forma recomendada es simplemente sobreescribir este metodo. La forma mas sencilla y practica (aunque algo salvaje) de hacerlo, es simplemente crear nuestra propia clase que sobreescriba este metodo:
public class EmailReady : System.Web.UI.Page
{
public override void VerifyRenderingInServerForm(Control control)
{
}
}
De manera que el metodo ahora no hace nada (usese bajo su propio riesgo).
Para que esto funcione, tendremos que cambiar la herencia de la clase de nuestra pagina, de
public partial class Pagina : System.Web.UI.Page
a
public partial class Pagina : EmailReady
Y nuestro método estara funcionando sin problemas.¬¬