以编程方式将用户控件加载到占位符 (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。标记来轻松测试,看看它是否在 aspx 页面上呈现。
【参考方案2】:我不太了解VB,但是您不需要将控件声明为UserControl而不仅仅是Control吗?例如尝试改变
Dim loadmodule As Control
到
Dim loadmodule As UserControl
【讨论】:
谢谢丹。不幸的是,在更改为 UserControl 之后,它似乎并没有什么不同。以上是关于以编程方式将用户控件加载到占位符 (asp.net)的主要内容,如果未能解决你的问题,请参考以下文章
使用设计器 ASP.NET C# 将事件附加到占位符内的控件
将占位符添加到 UITextField,如何以编程方式快速设置占位符文本?