asp.net UserControl继承,基本用户控件中的Web控件是空指针

时间:2010-03-01 00:06:55

标签: c# .net asp.net user-controls

我有一个基本用户控件(WC1),它继承自WebUserControl和一个继承自WC1的子用户控件(WC2)。我在vs设计视图中向WC1添加了一个textBox和一个标签,而不是后面的代码。 但是我放在WC1中的所有服务器控件都是null并且给出了空指针异常。我试图在不同的事件中访问textBox和label但是所有这些都是null。

有人知道这里出了什么问题吗?谢谢。

重现错误的步骤:

  1. 通过在VS
  2. 中添加新项目来创建名为WC1的Web用户控件
  3. 在VS的设计视图中向WC1添加了一个textBox和标签服务器控件,并将代码放在后面:var value = txetBox.Text;
  4. 通过在VS中添加一个新项目并在其后面的代码中将其基类更改为WC1来创建另一个名为WC2的Web用户控件
  5. 通过在vs中添加新项目并将WC2拖到页面的设计视图来创建网页
  6. 运行该页面,然后您将看到WC1中的代码隐藏异常
  7. 代码:

    WC1:

    code behind:
        public partial class WC1: System.Web.UI.UserControl
        {
            protected void Page_Load(object sender, EventArgs e)
            {
    
            }
        }
    

    页:

    <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WC1.ascx.cs" Inherits="WebApplication1.WC1" %>
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    

    WC2: 代码背后:

    public partial class WC2: WC1
        { var txt = TextBox1.Text}
    

    页:

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

    总结我的问题:

    在这种情况下可以实例化WC1的Web服务器控件吗?或者用户控件是否可以继承其他用户控件并将父级用户控件的Web服务器控件传送给其子级而无需担心布局?

    好的,我测试过如果我不在WC1代码隐藏中添加控件,它将永远不会被实例化。

1 个答案:

答案 0 :(得分:1)

如果您没有将基本类型设置为WC1,那么当您将控件添加到标记时,控件是在WC2的 designer.cs 中创建的,而这些控件是隐藏的继承自WC1。

要解决这个问题,只需打开WC2的designer.cs并删除控件,然后基类上的那些将成为编译时标记的内容。替代解决方案:确保您的基类是WC1,删除设计器,右键单击.ascx,然后选择转换为Web应用程序,这将重新生成设计器而不创建它找到的控件基类......同样的效果。

如果我误解了你,并且你试图继承基本控件的标记 ....你不能这样做,想想它将如何渲染,会是什么在哪里?如果它是其他的全部在一起,请发布你的标记和属性两个控件,这将清楚地说明发生了什么。