将 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 敏捷包解析器以另一种方式工作,还是将代码无错误地转换为字符串。没关系 - 我只需要让事情正常进行即可。
经过多次试错,我找到了一个有效的解决方案 - 它解决了问题。但是,它也引入了潜在的安全问题,因此您需要警惕它的使用方式。
只需将以下内容添加到页面:
- EnableEventValidation="false"
- 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.
但是,在不回发的页面上使用是安全的。
我正在尝试抓取我自己的 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 对禁用事件验证的看法:
This feature reduces the risk of unauthorized or malicious postback requests and callbacks. It is strongly recommended that you do not disable event validation.
但是,在不回发的页面上使用是安全的。