【问题标题】:System.Web.HttpException: A page can have only one server-side Form tagSystem.Web.HttpException:一个页面只能有一个服务器端 Form 标签
【发布时间】:2014-12-07 08:56:23
【问题描述】:

我设计了一个没有母版页且页面中只有一个 Form 标签的 aspx 网页。下面的代码获取包含所有控件的网页并将其作为电子邮件发送。代码运行良好,我收到了电子邮件,但收到错误消息:

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

一个页面只能有一个服务器端表单标签。

说明:在执行当前 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);   

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

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    这个错误的根本原因是 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);
    }
    

    【讨论】:

    • 非常感谢,解决了我的问题。
    猜你喜欢
    • 2011-08-16
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 2015-10-15
    • 2011-02-24
    • 1970-01-01
    相关资源
    最近更新 更多