我有一种情况,我在页面上的 2 个地方使用了一些标记,其中一个在转发器中。中继器中的那个没有初始化它的子控件;他们保持为空。
默认.aspx:
<%@ Page Title="Home Page" Language="C#" AutoEventWireup="true"
CodeBehind="Default.aspx.cs" Inherits="nestedcontroltest._Default" %>
<%@ Register TagPrefix="a" Namespace="nestedcontroltest" Assembly="nestedcontroltest" %>
<html>
<head>
<title>test</title>
</head>
<body>
<asp:Repeater runat="server" ID="rptLetters" OnItemDataBound="rptLetters_ItemDataBound">
<ItemTemplate>
<a:MyControl runat="server" ID="ctrlMyControl"/>
</ItemTemplate>
</asp:Repeater>
</body>
</html>
Default.aspx.cs:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
rptLetters.DataSource = new[] { "a", "b", "c" };
rptLetters.DataBind();
}
public void rptLetters_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
var ctrlMyControl = (MyControl)e.Item.FindControl("ctrlMyControl");
ctrlMyControl.Text = e.Item.DataItem.ToString();
}
}
我的控件.ascx:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MyControl.ascx.cs" Inherits="nestedcontroltest.MyControl" %>
<asp:Panel runat="server" ID="pnlContent">
<asp:Literal runat="server" ID="ltlText"/>
</asp:Panel>
我的控件.ascx.cs:
public partial class MyControl : UserControl
{
public string Text { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
ltlText.Text = Text;
}
}
当我尝试加载它时,我得到“对象引用未设置为对象的实例”。 - 显然 ltlText 为空。
如何让我的 UserControl 正确初始化?
最佳答案
找到答案:
- 中继器与问题无关。
在 Default.aspx 中,我需要按名称而不是按 namespace 注册控件。
<%@ Register TagPrefix="a" Namespace="nestedcontroltest" Assembly="nestedcontroltest" %>
需要改成
<%@ Register TagPrefix="a" TagName="MyControl" Src="~/MyControl.ascx" %>
然后控件会正确初始化,即使它在中继器中也是如此。也许是 ASP.net 中的错误,或者我可能需要使用完整的程序集名称?无论如何,感谢大家的帮助。
关于c# - 如果 Usercontrol 位于 Repeater 中,则不会初始化 Usercontrol 中的控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11682435/