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

时间:2010-04-15 09:51:57

标签: asp.net vb.net user-controls placeholder

在我的.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

结果是一个空的占位符,没有错误。

非常感谢您的帮助

在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

但遗憾的是,仍然没有结果。

2 个答案:

答案 0 :(得分: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);
        }
    }
}

答案 1 :(得分:2)

我不太了解VB,但是你不需要将控件声明为UserControl而不仅仅是Control吗?例如尝试更改

Dim loadmodule As Control

Dim loadmodule As UserControl