【问题标题】:Dynamically Loading a UserControl with LoadControl Method (Type, object[])使用 LoadControl 方法动态加载 UserControl (Type, object[])
【发布时间】:2009-01-16 13:40:18
【问题描述】:

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

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    MSDN page for LoadControl底部有这样的评论:

    描述
    使用 Page.LoadControl(Type, Object[]) 似乎没有创建它的孩子 在 ascx 文件中添加。使用 Page.LoadControl(String) 作为 预计。

    评论
    感谢您提交此问题。我们正在调查和 当我们有更多信息时,将提供状态更新。

    -Web 平台和工具团队
    Microsoft 于 2005 年 8 月 6 日上午 11:08 发布
    这是设计使然,因为“TestUC”类型实际上是 部分类使用的基类型,它不包含正确的 实例化 TextBox1 引用的代码,实际上定义在 派生类型。有两种解决方法: 1. 使用 LoadControl("TestControl.ascx"),对于所有实际情况,这表现 与 LoadControl(type) 相同,但它实例化派生类型, 它知道如何实例化 TextBox1。 2.使用单个文件页面和 向页面添加 指令以引用用户 控制,并为 ascx 页面分配一个类名。然后就安全了 使用负载控制(类型)

    感谢您报告问题。
    网络平台和工具团队。发表者 Microsoft 于 2005 年 6 月 14 日下午 6:31

    【讨论】:

      【解决方案2】:

      那个重载实例化了基类,但没有实例化它上面的任何控件,所以它不起作用。

      如果您有兴趣,我快速blog post 提供了传递参数的解决方法。

      【讨论】:

      • 嗨,无论哪种情况,我都可以将参数传递给控件。但我必须使用控件类型加载控件。
      • 您不能将参数与字符串方法一起使用。但是如果您需要按类型进行操作,这并没有真正的帮助。为什么需要使用其他重载?我唯一能想到的就是反思工作重载并在您自己的代码中复制它的作用。
      【解决方案3】:

      如果您想让控件完全呈现,一种方法是像现在使用LoadControl 一样实例化控件,然后将其临时添加到另一个控件的控件集合或页面本身。这将初始化该控件的生命周期并引发所有适当的事件。完成此操作后,您就可以从中获取呈现的 HTML 或您需要的任何内容。

      是的,这是一个 hack,但它会在紧要关头起作用。

      【讨论】:

      • 我不确定我明白你在说什么,但他不是已经将控件添加到页面的控件集合中:
         page.Controls.Add(controlToLoad) ; 
      • 我知道这个答案来自 ages 以前,但你能详细说明一下 Andrew 吗?或者让我写一篇关于这个解决方法的文章?我正在尝试将LoadControl 与类型参数一起使用,我的目的是将加载的控件添加到PlaceHolder,所以这对我来说并不是什么大问题。老实说,带有控制路径的魔术字符串(替代方案)对我来说似乎更像是一种黑客攻击!提前致谢。
      猜你喜欢
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多