将 ASPX 页面转换为字符串而不触发“需要放置在带有 runat="server"”消息的表单中

问题描述

我正在尝试抓取我自己的 ASPX 页面,以便我可以将其提供给 HTML Agility Pack 解析器。我已经尝试了所有方法,但在这种情况下,我只能使用字符串。

我正在使用以下代码将外部控件转换为字符串:

    static string ConvertControlToString(Control ctl)
    {
        string s = null;

        var sw = new StringWriter();
        using (var w = new HtmlTextWriter(sw))
        {
            ctl.RenderControl(w);
            s = sw.ToString();
        }
        return s;
    }

这个概念有效,除了一些恼人的故障。有时我会收到“控件必须在带有 runat=server 的表单内”。它似乎是由导致回发的控件触发的 - 按钮、更新面板等。

明确地说,我的页面一个表单,所以这不是问题。

我需要尝试找出我的问题的解决方案,无论是让 HTML 敏捷包解析器以另一种方式工作,还是将代码转换为没有错误的字符串。没关系 - 我只需要让事情运转起来。

解决方法

在多次尝试错误后,我找到了一个有效的解决方案 - 因为它解决了问题。但是,它也引入了潜在的安全问题,因此您需要警惕它的使用方式。

只需将以下内容添加到页面:

  1. EnableEventValidation="false"
  2. public override void VerifyRenderingInServerForm(Control control) {}

以下是 Microsoft 关于禁用事件验证的说明:

此功能可降低未经授权或恶意回发请求和回调的风险。强烈建议您不要禁用事件验证。

但是,在不回发的页面上使用是安全的。