System.Web.HttpException:一个页面只能有一个服务器端Form标记

时间:2014-10-12 19:23:50

标签: c# asp.net

我设计的aspx网页没有母版页,页面中只有一个Form标签。下面的代码将包含所有控件的网页,并将其作为电子邮件发送。代码工作正常,我收到电子邮件但是我收到错误:

应用程序中的服务器错误。

一个页面只能有一个服务器端的Form标签。

描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.Web.HttpException:一个页面只能有一个服务器端的Form标记。

        //code            
        StringBuilder sb = new StringBuilder();
        HtmlTextWriter tw = new HtmlTextWriter(new System.IO.StringWriter(sb));
        //Render the page to the new HtmlTextWriter which actually writes to the stringbuilder
        base.Render(tw);

        //Get the rendered content
        string sContent = sb.ToString();

        MailMessage message = new MailMessage();
        message.IsBodyHtml = true;
        message.To.Add(new MailAddress("<receipient"));
        message.Subject = "Your order";

        message.From = new MailAddress("sender");
        message.Body = sContent; //this would be filled with the previous page
        SmtpClient client = new SmtpClient("smtp server");
        client.Send(message);   

知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

此错误的根本原因是Page.Render被调用两次 第一次是您在代码中手动调用的那个,第二次是在页面生命周期中自动调用它的时间。 经过一番搜索后,我发现这篇帖子破解了页面渲染的内部结构,允许渲染两次

http://jberke.blogspot.com/2009/01/rendering-aspnet-page-twice.html

这个例子使用反射来重置在渲染过程中设置的标志,你需要做的就是在调用base.Render()后运行下面的代码块

System.Reflection.FieldInfo fi = typeof(Page).GetField("_fOnFormRenderCalled", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
if (fi != null)
{
    fi.SetValue(this, false);
}