将 ASPX 页面转换为字符串而不触发 'needs to be placed inside a form with a runat="server"' 消息

Convert ASPX page to string without triggering the 'needs to be placed inside a form with a runat="server"' message

我正在尝试抓取我自己的 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 对禁用事件验证的看法:

This feature reduces the risk of unauthorized or malicious postback requests and callbacks. It is strongly recommended that you do not disable event validation.

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