asp.net 使用LoadControl方法(Type,object[])动态加载UserControl

eqqqjvef  于 2023-06-07  发布在  .NET
关注(0)|答案(3)|浏览(203)

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

dgiusagp

dgiusagp1#

在LoadControl的MSDN页面上,底部有以下注解:
说明
使用Page.LoadControl(Type,Object[])加载用户控件的页似乎不会创建添加到ascx文件中的其子级。使用Page.LoadControl(String)可以按预期工作。
评论
感谢您提交此问题。我们正在调查,并将提供一个更新的状态时,我们有更多的信息。

  • Web平台和工具团队
    由Microsoft发布于2005年8月6日上午11:08
    这是设计使然,因为类型“TestUC”实际上是分部类使用的基类,它不包含示例化TextBox 1引用的正确代码,而TextBox 1引用实际上是在派生类型中定义的。有两种解决方法:1.使用LoadControl(“TestControl.ascx”),实际上,它的行为与LoadControl(type)相同,但它示例化派生类型,后者知道如何示例化TextBox 1。2.使用单个文件页,并将<%@ Reference %>指令添加到该页以引用用户控件,并为ascx页分配类名。那么使用LoadControl(type)是安全的
    感谢您报告此问题。
    Web平台和工具团队。由Microsoft发布于2005年6月14日下午6:31
mwkjh3gx

mwkjh3gx2#

该重载示例化基类,但不示例化基类上的任何控件,因此它不起作用。
如果您感兴趣的话,我做了一个快速的blog post传递参数的变通方法。

bkkx9g8r

bkkx9g8r3#

如果要完全呈现控件,一种方法是使用LoadControl示例化控件,然后将其临时添加到另一个控件的控件集合或页面本身。这将初始化该控件的生命周期,并引发所有正确的事件。一旦你完成了这一点,你就可以得到渲染的HTML或你需要的任何东西。
是的,这是一个黑客,但它会在紧要关头工作。

相关问题