user1067334
user1067334

Reputation: 243

A page can have only one server-side Form tag Error

Aspx page as requested

<%@ Page Title="" Language="C#" MasterPageFile="~/tier6a-educ.master" AutoEventWireup="true"
    EnableEventValidation="false" CodeFile="TAP_rubform_response.aspx.cs" Inherits="TAP_rubform_response" %>

<asp:Content ID="Content1" ContentPlaceHolderID="test1" runat="server">
    <head>
        <link href="StyleSheet.css" type="text/css" rel="Stylesheet" />
    </head>
    <div style="padding-left: 10pt">
        <form id="form1" runat="server">


        <asp:Table ID="Table11" runat="server" Height="16px" Width="845px">
            <asp:TableRow ID="TableRow10" runat="server" orderColor="Gray" BorderWidth="1pt"
                BorderStyle="Dotted" HorizontalAlign="Center">
                <asp:TableCell ID="TableCell10" runat="server" ColumnSpan="2"><h4>SECTION 1: STANDARDS AND OBJECTIVES</h4></asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Table ID="table38" runat="server" HorizontalAlign="center" BorderColor="Gray"
            BorderWidth="1pt" BorderStyle="Dotted" Width="850px" Style="line-height: 15pt"
            Font-Names="Trebuchet MS" Font-Size="11pt">
            <asp:TableRow ID="TableRow11" runat="server">
                <asp:TableCell ID="TableCell11" runat="server">
                    <asp:Label ID="Label22" runat="server">Rating &nbsp;       </asp:Label>
                    <asp:Label ID="Label23" Font-Bold="true" runat="server">    </asp:Label>
                </asp:TableCell>
            </asp:TableRow>
            <asp:TableRow ID="TableRow34" runat="server">
                <asp:TableCell ID="TableCell44" runat="server">
                    <asp:Label ID="Label48" runat="server">Evidence &nbsp;       </asp:Label>
                    <asp:Label ID="Label49" Font-Bold="true" runat="server">   </asp:Label>
                </asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Table ID="Table12" runat="server" Height="16px" Width="845px">
            <asp:TableRow ID="TableRow12" runat="server" orderColor="Gray" BorderWidth="1pt"
                BorderStyle="Dotted" HorizontalAlign="Center">
                <asp:TableCell ID="TableCell12" runat="server" ColumnSpan="2"><h4>SECTION 2: Presenting Instructional Content</h4></asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Table ID="table2" runat="server" HorizontalAlign="center" BorderColor="Gray"
            BorderWidth="1pt" BorderStyle="Dotted" Width="850px" Style="line-height: 15pt"
            Font-Names="Trebuchet MS" Font-Size="11pt">
            <asp:TableRow ID="TableRow13" runat="server">
                <asp:TableCell ID="TableCell15" runat="server">
                    <asp:Label ID="Label20" runat="server">Rating &nbsp;       </asp:Label>
                    <asp:Label ID="Label21" Font-Bold="true" runat="server">    </asp:Label>
                </asp:TableCell>
            </asp:TableRow>
            <asp:TableRow ID="TableRow39" runat="server">
                <asp:TableCell ID="TableCell49" runat="server">
                    <asp:Label ID="Label58" runat="server">Evidence &nbsp;       </asp:Label>
                    <asp:Label ID="Label59" Font-Bold="true" runat="server">   </asp:Label>
                </asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Table ID="Table13" runat="server" Height="16px" Width="845px">
            <asp:TableRow ID="TableRow14" runat="server" orderColor="Gray" BorderWidth="1pt"
                BorderStyle="Dotted" HorizontalAlign="Center">
                <asp:TableCell ID="TableCell13" runat="server" ColumnSpan="2"><h4>SECTION 3: Lesson Structure and Pacing</h4></asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Table ID="table3" runat="server" HorizontalAlign="center" BorderColor="Gray"
            BorderWidth="1pt" BorderStyle="Dotted" Width="850px" Style="line-height: 15pt"
            Font-Names="Trebuchet MS" Font-Size="11pt">
            <asp:TableRow ID="TableRow15" runat="server">
                <asp:TableCell ID="TableCell18" runat="server">
                    <asp:Label ID="Label24" runat="server">Rating &nbsp;       </asp:Label>
                    <asp:Label ID="Label25" Font-Bold="true" runat="server">    </asp:Label>
                </asp:TableCell>
            </asp:TableRow>
            <asp:TableRow ID="TableRow35" runat="server">
                <asp:TableCell ID="TableCell45" runat="server">
                    <asp:Label ID="Label50" runat="server">Evidence &nbsp;       </asp:Label>
                    <asp:Label ID="Label51" Font-Bold="true" runat="server">   </asp:Label>
                </asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Table ID="Table14" runat="server" Height="16px" Width="845px">
            <asp:TableRow ID="TableRow16" runat="server" orderColor="Gray" BorderWidth="1pt"
                BorderStyle="Dotted" HorizontalAlign="Center">
                <asp:TableCell ID="TableCell14" runat="server" ColumnSpan="2"><h4>SECTION 4: Activities and Materials </h4></asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Table ID="table4" runat="server" HorizontalAlign="center" BorderColor="Gray"
            BorderWidth="1pt" BorderStyle="Dotted" Width="850px" Style="line-height: 15pt"
            Font-Names="Trebuchet MS" Font-Size="11pt">
            <asp:TableRow ID="TableRow17" runat="server">
                <asp:TableCell ID="TableCell21" runat="server">
                    <asp:Label ID="Label26" runat="server">Rating &nbsp;       </asp:Label>
                    <asp:Label ID="Label27" Font-Bold="true" runat="server">    </asp:Label>
                </asp:TableCell>
            </asp:TableRow>
            <asp:TableRow ID="TableRow36" runat="server">
                <asp:TableCell ID="TableCell46" runat="server">
                    <asp:Label ID="Label52" runat="server">Evidence &nbsp;       </asp:Label>
                    <asp:Label ID="Label53" Font-Bold="true" runat="server">   </asp:Label>
                </asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Table ID="Table21" runat="server" Height="16px" Width="845px">
            <asp:TableRow ID="TableRow18" runat="server" orderColor="Gray" BorderWidth="1pt"
                BorderStyle="Dotted" HorizontalAlign="Center">
                <asp:TableCell ID="TableCell16" runat="server" ColumnSpan="2"><h4>SECTION 5: Academic Feedback</h4></asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Table ID="table5" runat="server" HorizontalAlign="center" BorderColor="Gray"
            BorderWidth="1pt" BorderStyle="Dotted" Width="850px" Style="line-height: 15pt"
            Font-Names="Trebuchet MS" Font-Size="11pt">
            <asp:TableRow ID="TableRow19" runat="server">
                <asp:TableCell ID="TableCell24" runat="server">
                    <asp:Label ID="Label28" runat="server">Rating &nbsp;       </asp:Label>
                    <asp:Label ID="Label29" Font-Bold="true" runat="server">    </asp:Label>
                </asp:TableCell>
            </asp:TableRow>
            <asp:TableRow ID="TableRow37" runat="server">
                <asp:TableCell ID="TableCell47" runat="server">
                    <asp:Label ID="Label54" runat="server">Evidence &nbsp;       </asp:Label>
                    <asp:Label ID="Label55" Font-Bold="true" runat="server">   </asp:Label>
                </asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Table ID="Table26" runat="server" Height="16px" Width="845px">
            <asp:TableRow ID="TableRow20" runat="server" orderColor="Gray" BorderWidth="1pt"
                BorderStyle="Dotted" HorizontalAlign="Center">
                <asp:TableCell ID="TableCell59" runat="server" ColumnSpan="2"><h4>SECTION 6: Grouping Students</h4></asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Table ID="table6" runat="server" HorizontalAlign="center" BorderColor="Gray"
            BorderWidth="1pt" BorderStyle="Dotted" Width="850px" Style="line-height: 15pt"
            Font-Names="Trebuchet MS" Font-Size="11pt">
            <asp:TableRow ID="TableRow21" runat="server">
                <asp:TableCell ID="TableCell27" runat="server">
                    <asp:Label ID="Label30" runat="server">Rating &nbsp;       </asp:Label>
                    <asp:Label ID="Label31" Font-Bold="true" runat="server">    </asp:Label>
                </asp:TableCell>
            </asp:TableRow>
            <asp:TableRow ID="TableRow38" runat="server">
                <asp:TableCell ID="TableCell48" runat="server">
                    <asp:Label ID="Label56" runat="server">Evidence &nbsp;       </asp:Label>
                    <asp:Label ID="Label57" Font-Bold="true" runat="server">   </asp:Label>
                </asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Table ID="Table32" runat="server" Height="16px" Width="845px">
            <asp:TableRow ID="TableRow40" runat="server" orderColor="Gray" BorderWidth="1pt"
                BorderStyle="Dotted" HorizontalAlign="Center">
                <asp:TableCell ID="TableCell71" runat="server" ColumnSpan="2"><h4>SECTION 7: Teacher Content Knowledge</h4></asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Table ID="table7" runat="server" HorizontalAlign="center" BorderColor="Gray"
            BorderWidth="1pt" BorderStyle="Dotted" Width="850px" Style="line-height: 15pt"
            Font-Names="Trebuchet MS" Font-Size="11pt">
            <asp:TableRow ID="TableRow23" runat="server">
                <asp:TableCell ID="TableCell30" runat="server">
                    <asp:Label ID="Label32" runat="server">Rating &nbsp;       </asp:Label>
                    <asp:Label ID="Label33" Font-Bold="true" runat="server">   </asp:Label>
                </asp:TableCell>
            </asp:TableRow>
            <asp:TableRow ID="TableRow24" runat="server">
                <asp:TableCell ID="TableCell31" runat="server">
                    <asp:Label ID="Label34" runat="server">Evidence &nbsp;       </asp:Label>
                    <asp:Label ID="Label35" Font-Bold="true" runat="server">   </asp:Label>
                </asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Table ID="Table39" runat="server" Height="16px" Width="845px">
            <asp:TableRow ID="TableRow42" runat="server" orderColor="Gray" BorderWidth="1pt"
                BorderStyle="Dotted" HorizontalAlign="Center">
                <asp:TableCell ID="TableCell91" runat="server" ColumnSpan="2"><h4>SECTION 8: Questioning</h4></asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Table ID="table8" runat="server" HorizontalAlign="center" BorderColor="Gray"
            BorderWidth="1pt" BorderStyle="Dotted" Width="850px" Style="line-height: 15pt"
            Font-Names="Trebuchet MS" Font-Size="11pt">
            <asp:TableRow ID="TableRow26" runat="server">
                <asp:TableCell ID="TableCell34" runat="server">
                    <asp:Label ID="Label36" runat="server">Rating &nbsp;       </asp:Label>
                    <asp:Label ID="Label37" Font-Bold="true" runat="server">   </asp:Label>
                </asp:TableCell>
            </asp:TableRow>
            <asp:TableRow ID="TableRow27" runat="server">
                <asp:TableCell ID="TableCell35" runat="server">
                    <asp:Label ID="Label38" runat="server">Evidence &nbsp;       </asp:Label>
                    <asp:Label ID="Label39" Font-Bold="true" runat="server">   </asp:Label>
                </asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Table ID="Table45" runat="server" Height="16px" Width="845px">
            <asp:TableRow ID="TableRow50" runat="server" orderColor="Gray" BorderWidth="1pt"
                BorderStyle="Dotted" HorizontalAlign="Center">
                <asp:TableCell ID="TableCell105" runat="server" ColumnSpan="2"><h4>SECTION 9: Thinking</h4></asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Table ID="table9" runat="server" HorizontalAlign="center" BorderColor="Gray"
            BorderWidth="1pt" BorderStyle="Dotted" Width="850px" Style="line-height: 15pt"
            Font-Names="Trebuchet MS" Font-Size="11pt">
            <asp:TableRow ID="TableRow29" runat="server">
                <asp:TableCell ID="TableCell38" runat="server">
                    <asp:Label ID="Label40" runat="server">Rating &nbsp;       </asp:Label>
                    <asp:Label ID="Label41" Font-Bold="true" runat="server">   </asp:Label>
                </asp:TableCell>
            </asp:TableRow>
            <asp:TableRow ID="TableRow30" runat="server">
                <asp:TableCell ID="TableCell39" runat="server">
                    <asp:Label ID="Label42" runat="server">Evidence &nbsp;       </asp:Label>
                    <asp:Label ID="Label43" Font-Bold="true" runat="server">   </asp:Label>
                </asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Table ID="Table50" runat="server" Height="16px" Width="845px">
            <asp:TableRow ID="TableRow56" runat="server" orderColor="Gray" BorderWidth="1pt"
                BorderStyle="Dotted" HorizontalAlign="Center">
                <asp:TableCell ID="TableCell117" runat="server" ColumnSpan="2"><h4>SECTION 10: Problem Solving</h4></asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Table ID="table10" runat="server" HorizontalAlign="center" BorderColor="Gray"
            BorderWidth="1pt" BorderStyle="Dotted" Width="850px" Style="line-height: 15pt"
            Font-Names="Trebuchet MS" Font-Size="11pt">
            <asp:TableRow ID="TableRow32" runat="server">
                <asp:TableCell ID="TableCell42" runat="server">
                    <asp:Label ID="Label44" runat="server">Rating &nbsp;       </asp:Label>
                    <asp:Label ID="Label45" Font-Bold="true" runat="server">   </asp:Label>
                </asp:TableCell>
            </asp:TableRow>
            <asp:TableRow ID="TableRow33" runat="server">
                <asp:TableCell ID="TableCell43" runat="server">
                    <asp:Label ID="Label46" runat="server">Evidence &nbsp;       </asp:Label>
                    <asp:Label ID="Label47" Font-Bold="true" runat="server">   </asp:Label>
                </asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Table ID="Table15" runat="server" BorderColor="Gray" BorderWidth="1pt" BorderStyle="Dotted"
            Width="850px" HorizontalAlign="Center">
            <asp:TableRow ID="TableRow48" runat="server">
                <asp:TableCell ID="TableCell101" HorizontalAlign="left" ColumnSpan="1" runat="server"
                    Font-Size="Large">
                    <asp:Button ID="Button1" Text="Send As e-Mail" runat="server" OnClick="SendAsEmail_Click"
                        Font-Size="10pt" Height="18pt" Width="90pt" ValidationGroup="onsubmit" />
                </asp:TableCell>
                <asp:TableCell ID="TableCell19" HorizontalAlign="center" ColumnSpan="1" runat="server"
                    Font-Size="Large">
                    <asp:Button ID="Button3" Text="Save As PDF" runat="server" OnClick="SaveAsPDF_Click"
                        Font-Size="10pt" Height="18pt" Width="90pt" ValidationGroup="onsubmit" />
                </asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        </form>
    </div>
</asp:Content>

I have an aspx page and inside that I have a button that when the user clicks the page is sent to the user as an email.

This is the code I have written for the button's click function

protected void SendasEmail_Click(object sender, EventArgs e)
{
    StringWriter sw = new StringWriter();
    HtmlTextWriter hw = new HtmlTextWriter(sw);
    this.Page.RenderControl(hw);

    SmtpClient smtpClient = new SmtpClient();
    MailMessage message = new MailMessage();

    MailAddress fromAddress = new MailAddress("xxxxx");
    smtpClient.Host = "xxxxxxx";
    smtpClient.Port = 25;
    message.From = fromAddress;
    message.To.Add("xxxxxx");
    message.Subject = "The webpage is below";
    message.IsBodyHtml = true;
    message.Body = sw.ToString();        
    smtpClient.Send(message);
    }

I can receive the email fine but after the page is executed, the following error is displayed.

I am absolutely there is only form within the page because if the implementation of the above function is empty,I do not get any error. The webpage loads fine and clicking the button does nothing.

A page can have only one server-side Form tag.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Web.HttpException: A page can have only one server-side Form tag.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[HttpException (0x80004005): A page can have only one server-side Form tag.]
   System.Web.UI.Page.OnFormRender() +8721176
   System.Web.UI.HtmlControls.HtmlForm.RenderChildren(HtmlTextWriter writer) +33
   System.Web.UI.HtmlControls.HtmlContainerControl.Render(HtmlTextWriter writer) +32
   System.Web.UI.HtmlControls.HtmlForm.Render(HtmlTextWriter output) +51
   System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
   System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +99
   System.Web.UI.HtmlControls.HtmlForm.RenderControl(HtmlTextWriter writer) +40
   System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +134
   System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +19
   System.Web.UI.Control.Render(HtmlTextWriter writer) +10
   System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
   System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +99
   System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
   System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +134
   System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +19
   System.Web.UI.Control.Render(HtmlTextWriter writer) +10
   System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
   System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +99
   System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
   System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +134
   System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +19
   System.Web.UI.Page.Render(HtmlTextWriter writer) +29
   System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
   System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +99
   System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1266

It seems like this error is because I am making the function call this.Page.RenderControl(hw);

Does anyone have any experience on how to resolve this issue?

Thank you.

Upvotes: 3

Views: 12459

Answers (2)

Dave Zych
Dave Zych

Reputation: 21887

It looks as though you must have disabled EventValidation on your page, otherwise you'd be getting a RegisterForEventValidation can only be called during Render(); error.

What looks like is happening is that the page is being rendered in it's entirety into your HtmlTextWriter, and then re-rendered during the Render event to be outputted in the Response. This is probably causing ASP to see two Form tags and throwing the error. The solution would be to override the Render method of the page, capture the html you want, send it in the email and also write the html to the Response to be shown on the page.

This link has a good description of what's going on and how to override Render.

EDIT: You should be able to call base.Render and capture the output to write to the Response as well as your email.

In your button click, set a boolean value indicating whether to email the page:

public void myButton_Click(object sender, EventArgs e)
{
    okayToEmail = true;
}

And then when you override render, render the page into a new HtmlTextWriter, write the contents to the page's HtmlTextWriter, and check the value of the flag. If true, send the contents in an email.

protected override void Render(HtmlTextWriter writer)
{
    var sb = new StringBuilder();
    using (var sw = new StringWriter(sb))
    {
        using (var htw = new HtmlTextWriter(sw))
        {
            base.Render(htw);
            writer.Write(sb.ToString());

            if (okayToEmail)
            {
                using (var message = new MailMessage())
                {
                    message.Body = sb.ToString();
                    ...
                }
            }
        }
    }
}

Remember though: writing the entire page into the body of your email is probably not good... It will include the Doctype tag, the html and body tags, etc which will be stripped out by most (probably all) email clients. Also, linked stylesheets will not work, and I believe most email clients will strip out embedded stylesheets.

Upvotes: 3

nunespascal
nunespascal

Reputation: 17724

There is a standard way to intercept and handle the response sent to the browser.
If you want to receive this response and process it you should use Response filters

private void Page_Load(object sender, EventArgs e)
{

  // Filter the text to be rendered as all uppercase.
  Response.Filter = new UpperCaseFilterStream(Response.Filter);
}

The UpperCaseFilter class, a custom Stream class that converts all text that passes through it to uppercase.

Asp.net will call the Write method of the stream. You will need to do some buffering inside the stream class as it may receive data in chunks.

Upvotes: 1

Related Questions