如果UserControl中的控件位于Repeater中,则不会初始化它们

时间:2012-07-27 06:16:58

标签: c# asp.net .net

我遇到的情况是我在页面上的2个位置使用了一些标记,其中一个位于转发器中。转发器中的那个没有初始化其子控件;他们保持无效。

Default.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();
    }
}

MyControl.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>

MyControl.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正确初始化?

2 个答案:

答案 0 :(得分:6)

找到答案:

  1. 转发器与此问题无关。
  2. 在Default.aspx中,我需要按名称而不是命名空间注册控件。

    <%@ Register TagPrefix="a" Namespace="nestedcontroltest" Assembly="nestedcontroltest" %>
    

    需要改为

    <%@ Register TagPrefix="a" TagName="MyControl" Src="~/MyControl.ascx" %>
    
  3. 然后控件正确初始化,即使它在转发器中也是如此。也许是ASP.net中的一个错误,或者我需要使用完整的程序集名称?无论如何,感谢所有帮助人员。

答案 1 :(得分:0)

由于您没有在标记中添加Bind或Eval表达式,可能是e.Item.DataItem为null,而不是ltlText?

调试器说什么?