我设计的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);
知道如何解决这个问题吗?
答案 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);
}