将用户控件以编程方式加载到占位符中(asp.net)

4

在我的.aspx页面中,我有以下内容:

    <%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" AspCompat="True" %>

    <%@ Register src="Modules/Content.ascx" tagname="Content" tagprefix="uc1" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <title></title>
    </head>
    <body>
    <form id="form1" runat="server">
        <div>
        <asp:PlaceHolder ID="Modulecontainer" runat="server"></asp:PlaceHolder>
        </div>
        </form>
    </body>  
</html>

在我的aspx.vb文件中,我有以下内容;
    Try
        Dim loadmodule As UserControl
        loadmodule = Me.LoadControl("~/modules/content.ascx")
        Modulecontainer.Controls.Add(loadmodule)
    Catch ex As Exception
        Response.Write(ex.ToString & "<br />")
    End Try

结果是一个空的占位符,没有错误。
非常感谢您的帮助。
P.S 在Fat_Tony的回答后,我将代码更改为:
Try
            Dim loadmodule As ASP.ContentModule
            loadmodule = CType(LoadControl("~\Modules\Content.ascx"), ASP.ContentModule)
            Modulecontainer.Controls.Add(loadmodule)
        Catch ex As Exception
            Response.Write(ex.ToString & "<br />")
        End Try

但是很不幸,仍然没有结果。

该模块位于/modules/content.ascx。 - Phil
2个回答

5

在声明您的UserControl时,不要将其声明为“Control”类型,而应声明为您在UserControl.ascx文件中指定的类名:

<%@ Control className="MyUserControl" %>

因此,在您的代码后台的.aspx页面上:

Dim objControl as ASP.MyUserControl = CType(LoadControl("~\Controls\MyUserControl.ascx"), ASP.MyUserControl)

更多信息可在MSDN上找到。

编辑:检查你的用户控件的代码后台文件,注意其中的命名空间和类名。当我创建我的用户控件时,它被自动添加到一个包含文件夹名称和应用程序命名空间的命名空间中。

然后,在您的 .aspx.vb 文件中,将 "ASP.ContentModule" 替换为您的 .ascx.vb 文件中的 "Namespace.ClassName"。同时,确保仍在您的占位符上调用 Add 方法。

我的示例是使用 C# 编写的,但如果需要,我也可以提供 vb 版本的示例。我的应用程序方便地被命名为 "Tester"。

ASCX 后台代码:

namespace Tester.modules
{
    public partial class content : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
    }
}

ASPX的代码后台:

namespace Tester
{
    public partial class _Default : System.Web.UI.Page
    {   
        private Namespace.ClassName loadmodule;
        protected void Page_Load(object sender, EventArgs e)
        {
            loadmodule = (Namespace.ClassName)LoadControl("~/modules/content.ascx");
            Modulecontainer.Controls.Add(loadmodule);
        }
    }
}

谢谢,我已经将loadmodule声明移动到page_load之外,并更改为<%@ Reference Control="~/modules/content.ascx" %>,并在用户控件中添加了ClassName="ContentModule",但不幸的是仍然没有结果。 - Phil
1
只是出于好奇,如果您通常在页面上声明用户控件,它是否正常工作?即<ucl:Content id="uclContent" runat="server"/>。别忘了改回@Register。 - GShenanigan
1
好的,我已经快速编写了一个相同功能的应用程序,并且似乎可以工作。我已经编辑了我的上面的帖子,包括我所做的事情。 - GShenanigan
1
看起来问题现在更多地涉及用户控件上的加载事件。可以通过向控件添加静态<p>标记进行测试,看看它是否在aspx页面上呈现。 - GShenanigan
它的渲染正常。我在aspx和ascx.vb中都有一个page_load...我认为这就是问题所在。 - Phil
显示剩余2条评论

2
我不太了解VB,但是您需要声明该控件为UserControl而不仅仅是Control吗?例如,尝试更改:
Dim loadmodule As Control

Dim loadmodule As UserControl

谢谢,丹。不幸的是,在更改为UserControl之后,似乎并没有产生任何区别。 - Phil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接