Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用户控件内部的控件don';如果它';在中继器里有什么_C#_Asp.net_.net - Fatal编程技术网

C# 用户控件内部的控件don';如果它';在中继器里有什么

C# 用户控件内部的控件don';如果它';在中继器里有什么,c#,asp.net,.net,C#,Asp.net,.net,我有一种情况,我在一个页面上的两个位置使用一些标记,其中一个在转发器中。中继器中的一个未初始化其子控件;他们保持沉默 Default.aspx: <%@ Page Title="Home Page" Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="nestedcontroltest._Default" %> <%@ Register TagPrefix="a" Nam

我有一种情况,我在一个页面上的两个位置使用一些标记,其中一个在转发器中。中继器中的一个未初始化其子控件;他们保持沉默

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>
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>
当我尝试加载它时,我得到“对象引用未设置为对象的实例”-显然ltlText为null


如何使我的UserControl正确初始化?

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

调试器说了什么?

找到了答案:

  • 中继器与问题无关
  • 在Default.aspx中,我需要按名称而不是名称空间注册控件

    <%@ Register TagPrefix="a" Namespace="nestedcontroltest" Assembly="nestedcontroltest" %>
    
    
    
    需要改成

    <%@ Register TagPrefix="a" TagName="MyControl" Src="~/MyControl.ascx" %>
    
    
    

  • 然后控件被正确初始化,即使它在中继器中。可能是ASP.net中的错误,或者我需要使用完整的程序集名称?不管怎样,谢谢大家的帮助。

    如果调试器出现在
    ltlText.Text
    上,那么肯定会初始化控件,但是
    ltlText
    没有初始化。所以,我想问题出在你的用户控件上。用户控件没有像
    Page\u Load
    这样的方法,但只有
    OnLoad(EventArgs e)
    方法,所以要注意在控件中使用Page方法,有时很难调试为什么某些控件为null。你注册了对用户控件的引用吗,比如:?嗨,伙计们,我已经更新了Default.aspx,加入了
    @Register
    指令。谢谢yogi,你说得对,中继器是个麻烦。原来问题出在我的
    @Register
    指令中;按名称空间和程序集注册似乎不会导致初始化控件,但按名称注册控件是有效的。现在看看我是否能回答我自己的问题..不,调试器说e.Item.DataItem是“a”,然后是“b”,然后是“c”,就像你所期望的那样。异常肯定在
    ltlText.Text=Text行上和ltlText绝对为空。我永远不会忘记这一点!谢谢你,克里斯!
    
    <%@ Register TagPrefix="a" Namespace="nestedcontroltest" Assembly="nestedcontroltest" %>
    
    <%@ Register TagPrefix="a" TagName="MyControl" Src="~/MyControl.ascx" %>