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

Posted

技术标签:

【中文标题】以编程方式将用户控件加载到占位符 (asp.net)【英文标题】:Loading user controls programatically into a placeholder (asp.net) 【发布时间】:2011-02-08 07:28:03 【问题描述】:

在我的 .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 【参考方案1】:

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

<%@ Control className="MyUserControl" %>

所以在 .aspx 页面上的代码隐藏中:

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

更多信息请访问MSDN。

编辑:检查用户控件的代码隐藏文件,并记下其中的命名空间和类名。当我创建用户控件时,它会自动添加到包含文件夹名称和应用程序名称空间的名称空间中。

然后,在 .aspx.vb 中,将 .ascx.vb 文件中的“ASP.ContentModule”替换为“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 之外并更改为 并将 ClassName="ContentModule" 添加到用户控制,但不幸的是仍然没有结果。 只是出于好奇,如果你在页面上正常声明,用户控件是否正常工作? IE。 。不要忘记为此改回@Register。 我认为问题可能更复杂。我现在加载了用户控件,但其中仍然没有内容。不过你的解决方案奏效了。 好的,我已经开发了一个快速应用程序,它的功能相同,它似乎可以工作。我已经编辑了上面的帖子,以包含我所做的事情。 听起来问题现在更多地与用户控件上的加载事件有关。通过向控件添加静态

标记来轻松测试,看看它是否在 aspx 页面上呈现。

【参考方案2】:

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

Dim loadmodule As Control

Dim loadmodule As UserControl

【讨论】:

谢谢丹。不幸的是,在更改为 UserControl 之后,它似乎并没有什么不同。

以上是关于以编程方式将用户控件加载到占位符 (asp.net)的主要内容,如果未能解决你的问题,请参考以下文章

使用设计器 ASP.NET C# 将事件附加到占位符内的控件

将占位符添加到 UITextField,如何以编程方式快速设置占位符文本?

c# asp.net,添加自定义控件

将数据从 ASP.NET 页面传递到动态加载的 ASCX 用户控件

Asp.net 如何取母版页的属性及控件及方法调用求解答

如何在占位符上使用工具提示?