我正在尝试通过页面方法返回用户/服务器控件的html表示。当我调用带有虚拟路径到用户控件的重载时,它工作,但是当我尝试调用带有类型的重载时,它不起作用。示例代码如下。有什么建议吗?
[WebMethod]
public static string LoadAlternates(string productId, string pnlId)
{
object[] parameters = new object[] { pnlId, productId };
return ControlAsString(typeof(PopupControl), parameters);
}
private static string ControlAsString(Type controlType, object[] parameters)
{
Page page = new Page();
UserControl controlToLoad;
/*
*calling load control with the type results in the
*stringwriter returning an empty string
*/
controlToLoad = page.LoadControl(controlType, parameters) as UserControl;
/*
*However, calling LoadControl with the following overload
*gives the correct result, ie the string rep. of the control.
*/
controlToLoad = page.LoadControl(@"~/RepeaterSamples/PopupControl.ascx") as UserControl;
//some more code, then this...
page.Controls.Add(controlToLoad);
StringWriter sw = new StringWriter();
HttpContext.Current.Server.Execute(page, sw, false);
return sw.ToString();
}
为什么这个StringWriter会返回一个空字符串?我应该指出,无论选择何种方法调用LoadControl,所有“页面”生命周期都能正确执行。
想要添加 -
我 使用LoadControl(Type, object[])
重载。 : - (
答案 0 :(得分:25)
在MSDN page for LoadControl上,底部有此评论:
描述
使用。加载用户控件的页面 Page.LoadControl(Type,Object [])似乎没有创建它的子节点 添加在ascx文件中。使用Page.LoadControl(String)作为 预期评论
感谢您提交此问题。我们正在调查和 我们会在获得更多信息时提供最新状态。- 网络平台&工具团队由Microsoft于2005年6月8日上午11:08发布由于“TestUC”类型实际上是 部分类使用的基类型,它不包含正确的类 代码实例化TextBox1引用,实际定义在 派生类型。有两种解决方法:1。使用 LoadControl(“TestControl.ascx”),对于所有实际的,这种行为 与LoadControl(类型)相同,但它实例化派生类型, 它知道如何实例化TextBox1。 2.使用单个文件页面 添加<%@ Reference%>指向页面的指令以引用用户 控制,并为ascx页面分配一个类名。那么它是安全的 使用LoadControl(类型)
感谢您报告此问题。
网站平台和工具团队。发布者 微软于2005年6月14日下午6:31
答案 1 :(得分:6)
该重载实例化基类,但不实例化其上的任何控件,因此它不起作用。
如果您有兴趣,我就传递参数的方法快速blog post。
答案 2 :(得分:0)
如果您希望完全呈现控件,则可以使用LoadControl
实例化控件,然后暂时将其添加到另一个控件或页面本身的控件集合中。这将初始化该控件的生命周期并导致引发所有正确的事件。完成此操作后,您就可以从中获取所呈现的HTML或其他任何内容。
是的,这是一个黑客攻击,但它会起作用。