C# - Issue with RenderControl , 'RegisterForEventValidation can only be called during Render()'

4.8k Views Asked by At

I need do get Html of GridView and send email.

My GridView Design is mentioned as below

<div id="DivEmail" class="clear">
    <asp:Repeater ID="rpt1" runat="server" OnItemDataBound="rpt1_ItemDataBound">
        <ItemTemplate>
            <asp:HiddenField ID="TypeID" runat="server" Value='<%# Eval("TypeID") %>' />
            <div id='Handle<%# Eval("TypeName")%>' class="ulheader" >
                <asp:Label ID="lblType" runat="server" Text='<%# Eval("TypeName")%>' ></asp:Label>
            </div>
            <div id="Reuslt<%# Eval("TypeName")%>">
                <asp:GridView ID="grvReport" runat="server" Width="100%" BorderColor="#e4e4e4" border="0" Style="border-collapse: collapse;" ShowHeader="true" CellPadding="5" CellSpacing="0" AutoGenerateColumns="false" EmptyDataText="No Results Found" AllowPaging="false" AllowSorting="false" CssClass="grid grid-iq" BackColor="#FFFFFF">
                    <Columns>
                        <asp:TemplateField HeaderText="Image">
                            <ItemTemplate>
                                <asp:Image ID="thumb" Width="100px" Height="100px" runat="server" ImageUrl='<%# Eval("ImageUrl") %>' 
                                                 ImageAlign="Middle" />
                            </ItemTemplate>
                            ItemStyle CssClass="center" Height="20px" />
                            <HeaderStyle CssClass="grid-th center" Width="100px" VerticalAlign="Top" />
                        </asp:TemplateField>
                        <asp:BoundField DataField="Title" HeaderText="Title">
                            <HeaderStyle Height="20px" Width="20%" CssClass="grid-th-left" VerticalAlign="Top" />
                            <ItemStyle CssClass="left"></ItemStyle>
                        </asp:BoundField>
                        <asp:BoundField DataField="Description" HeaderText="Description">
                            <HeaderStyle Height="20px" Width="28%" CssClass="grid-th-left" VerticalAlign="Top" />
                            <ItemStyle CssClass="left"></ItemStyle>
                        </asp:BoundField>
                        <asp:TemplateField ShowHeader="false" HeaderText="View">
                            <ItemTemplate>
                                <asp:LinkButton ID="lbtnLink" runat="server" CommandArgument='<%# Bind("ID") %>'
                                  OnCommand="lbtnView_OnCommand" Text="View"></asp:LinkButton>
                            </ItemTemplate>
                            <ItemStyle CssClass="center" Height="20px" />
                            <HeaderStyle CssClass="grid-th center" Width="9%" VerticalAlign="Top" />
                        </asp:TemplateField>
                    </Columns>
                    <HeaderStyle CssClass="grid-th" Height="10px" HorizontalAlign="Center" VerticalAlign="Top"></HeaderStyle>
                </asp:GridView>
            </div>
        </ItemTemplate>
    </asp:Repeater>
</div>

To grab Html of server control , I use below code

protected void btnOK_Click(object sender, EventArgs e)
{
    var sb = new StringBuilder();
    DivEmail.RenderControl(new HtmlTextWriter(new StringWriter(sb)));
    EmailContent += sb.ToString();
}

public override void VerifyRenderingInServerForm(Control control)
{
    /* Confirms that an HtmlForm control is rendered for the specified ASP.NET
    server control at run time. */
}

By doing such , I m getting Exception

RegisterForEventValidation can only be called during Render()

I googled a bit on the issue, results says to set EnableEventValidation="false" in @page directive. but I can not use this solution.

Can anybody help me on this to solve??

0

There are 0 best solutions below