ASP.NET UserControl不初始化子控件

时间:2008-10-28 13:14:59

标签: .net asp.net

在我的页面中,我有以下内容:

<aspe:UpdatePanel runat="server" ID="updatePanel">
    <ContentTemplate>
        <local:KeywordSelector runat="server" ID="ksKeywords" />
    </ContentTemplate>
</aspe:UpdatePanel>

KeywordSelector控件是我在同一个程序集中定义的控件,local映射到其命名空间。

控件由其他几个控件组成,定义如下:

<%@ Control Language="C#" AutoEventWireup="true"
            CodeBehind="KeywordSelector.ascx.cs"
            Inherits="Keywords.KeywordSelector" %>

并且有很多自己的服务器控件,都被定义为.designer.cs文件中的成员。

但是,在控件生命周期的任何部分都没有任何子控件对象,也不会产生HTML

  1. .designer.cs文件中定义的所有成员均为null
  2. 致电HasControls返回false
  3. 致电EnsureChildControls不做任何事。
  4. Controls集合为空。
  5. 删除UpdatePanel没有任何好处。我尝试在一个带有新UserControl的干净页面中重现它,同样的事情发生了。

    我在.NET Framework 3.5 SP1上使用ASP.NET和集成的Web服务器。

    我在这里缺少什么?

    更新#1:在Rob的评论之后,我调查了OnInit,发现UserControl没有检测到它有任何子控件。而且,永远不会调用CreateControlCollection

2 个答案:

答案 0 :(得分:24)

好吧,我发现了问题:

  1. 用户控件,而不是自定义控件必须在 web.config 文件中逐个注册。这样做:

    <add tagPrefix="local" tagName="KeywordSelector" src="~/KeywordSelector.ascx" />

    而不是:

    <add tagPrefix="local" namespace="Keywords" assembly="Keywords" />

  2. 您永远不应将WebControl放在与使用它的Control相同的目录中。这是彻头彻尾的愚蠢。 Read about it here

  3. 感谢您的帮助。现在,如果我能将自己的答案标记为 答案......

答案 1 :(得分:0)

在我的情况下,原因是Resharper 7.1在aspx的顶部添加了错误的@Register指令 - 而不是这个所需的行:

<%@ Register Src="~/Controls/Hello/Hello.ascx" TagName="Hello" TagPrefix="p" %>
我错了一个:

<%@ Register TagPrefix="p" Namespace="MyNamespace.WebApp.Controls" Assembly="MyApp.Web" %>