问题描述
我正在尝试抓取我自己的 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 敏捷包解析器以另一种方式工作,还是将代码转换为没有错误的字符串。没关系 - 我只需要让事情运转起来。
解决方法
在多次尝试错误后,我找到了一个有效的解决方案 - 因为它解决了问题。但是,它也引入了潜在的安全问题,因此您需要警惕它的使用方式。
只需将以下内容添加到页面:
- EnableEventValidation="false"
- public override void VerifyRenderingInServerForm(Control control) {}
以下是 Microsoft 关于禁用事件验证的说明:
此功能可降低未经授权或恶意回发请求和回调的风险。强烈建议您不要禁用事件验证。
但是,在不回发的页面上使用是安全的。