我想使用ascx作为模板,并使用生成的html作为ajax方法的返回值以编程方式呈现它。
Page pageHolder = new Page();
MyUserControl ctlRender = (MyUserControl)pageHolder.LoadControl(typeof(MyUserControl),null);
pageHolder.Controls.Add(ctlRender);
System.IO.StringWriter swOutput = new System.IO.StringWriter();
HttpContext.Current.Server.Execute(pageHolder, swOutput, false);
return swOutput.ToString();
这一切都会执行,并且用户控件的Page Load事件会触发,但StringWriter始终为空。我在其他例子中看到了类似的代码,我错过了什么?
答案 0 :(得分:3)
你试过这个:
public string RenderControl(Control ctrl)
{
StringBuilder sb = new StringBuilder();
StringWriter tw = new StringWriter(sb);
HtmlTextWriter hw = new HtmlTextWriter(tw);
ctrl.RenderControl(hw);
return sb.ToString();
}
直接来自这篇文章:
答案 1 :(得分:0)
你总是要使用像this.Controls.Add(TemplateControl.LoadControl("〜/ PathTo / YourControl.ascx")
原因是,没有类型的内部映射到ascx文件(只有另一种方式arround)。所以这意味着如果初始化新的YourControl(),它将不会执行您在ascx部分中定义的任何操作。如果你有
protected override void protected override void Render(HtmlTextWriter output) {
output.WriteLine("Test");
}
这会给你"测试"在你控制的地方。