使用LoadControl方法动态加载UserControl(类型,对象[])

时间:2009-01-16 13:40:18

标签: c# asp.net

我正在尝试通过页面方法返回用户/服务器控件的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[])重载。 : - (

3 个答案:

答案 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或其他任何内容。

是的,这是一个黑客攻击,但它会起作用。