从外部页面上下文渲染ascx控件

时间:2014-03-20 12:29:02

标签: asp.net

尝试从WebService呈现ascx UserControl的HTML时,出现错误RegisterForEventValidation can only be called during Render

这是this question的副本。但是给出的答案不起作用......

解决方案始终涉及EnableEventValidation="false"override VerifyRenderingInServerForm,但这些仅适用于Page,而不适用于Control(ascx是什么)。

将ascx更改为aspx时,以下代码失败:page.LoadControl("mycontrol.ascx/aspx")并且根据this question呈现aspx显然不那么容易。

问题
如何在没有例外的情况下渲染我的ascx?

奖金问题:
为什么EnableEventValidation在控件上不可用,而网上有很多例子声称不然? (StackOverflow,CodeProject,...)

1 个答案:

答案 0 :(得分:2)

我找到了解决方案:

var page = new System.Web.UI.Page();

// Or RenderControl throws 'RegisterForEventValidation can only be called during Render'
page.EnableEventValidation = false; 

// Or generates a second hidden field with ID=_VIEWSTATE
page.EnableViewState = false; 
var sb = new StringBuilder();

var ctl = (SomeAscx)page.LoadControl("SomeAscx.ascx");
using (var sw = new StringWriter(sb))
using (var htw = new HtmlTextWriter(sw))
{
     ctl.RenderControl(htw);
}

string result = sb.ToString();

关键是设置:

page.EnableEventValidation = false; 
page.EnableViewState = false;