在aspx页面中动态加载用户控件

时间:2018-03-29 18:56:18

标签: c# asp.net

我有以下aspx页面,例如:called choosemenu.aspx

      <!DOCTYPE html>

 <html xmlns="http://www.w3.org/1999/xhtml">
 <head runat="server">
     <title></title>
 </head>
 <body>
     <form id="form1" runat="server">
         <div>
         </div>
       <div id="renderhere" runat="server">render user control here </div>
     </form>
 </body>
 </html>

我有一个名为

的ascx页面列表
 english.ascx
 commerce.ascx
 maths.ascx

我必须根据aspx页面中的查询字符串动态加载我的aspx页面中的ascx文件。

我在page_load事件的aspx页面中有以下内容。

   var control = (English)Page.LoadControl("/ascx/english.ascx");

我如何在choosemenu.aspx中渲染english.ascx页面的内容呢?

此外,我必须在ascx文件中传递一些值。这是静态的东西。

   <Menu:MNU ID="english" runat="server" HiLiter="<%#h %>"></Menu:MNU>

2 个答案:

答案 0 :(得分:3)

从服务器端加载控件

protected void Page_Load(object sender, EventArgs e)
{
    Page.Controls.Add(Page.LoadControl("~/ascx/english.ascx")); //CHECK THE PATH 
}

从服务器端加载控件并将其渲染为div 如果您想在特定的div中呈现它,您可以写:

protected void Page_Load(object sender, EventArgs e)
{
    UserControl uc = (UserControl)Page.LoadControl("~/ascx/english.ascx");
    uc.MyParameter = 1;
    uc.Id = 2;
    uc.someMethodToInitialize();
    div1.Controls.Add(uc);
}

并在您的aspx页面中:

<div id="div1" runat="server">

</div>

从服务器端加载控件,使用参数

初始化控件

如果您的control有一个constructor parameters,则必须使用:

public English_Control(int MyParameter,int Id) {     //代码在这里.. }

aspx.cs文件中,您可以使用以下内容进行初始化:

UserControl uc = (UserControl)Page.LoadControl(typeof(English_Control), new object[] {1, 2});
div1.Controls.Add(uc);

答案 1 :(得分:1)

为了使控件的回发值可用,您必须在不晚于PreInit的情况下加载并重新加载它。以下是您需要执行此操作的代码。

    protected override void OnPreInit(EventArgs e)
    {
        string controlToLoad = String.Empty;
        //logic to determine which control to load
        UserControl userControl = (UserControl)LoadControl(controlToLoad);
        renderhere.Controls.Add(userControl);
        base.OnPreInit(e);
    }

根据MSDN

  

Pre-Init事件用于“创建或重新创建动态控件。”