2010-03-01 58 views
2

我有一个基本的用户控件(WC1),它继承自WebUserControl和从WC1继承的子用户控件(WC2)。我在vs设计视图中添加了一个文本框和一个标签给WC1,而不是代码隐藏。 但我放入WC1的所有服务器控件都是空的,并给出空指针异常。我尝试访问不同事件中的文本框和标签,但它们全部为空。asp.net UserControl继承,基本用户控件中的Web控件是空指针

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

步骤来重现错误:

  1. 创建的名为WC1 web用户控制VS
  2. 添加新项
  3. 加入VS的设计视图中的文本框和标签服务器控件WC1和放码后面:var value = txetBox.Text;
  4. 创建的名为WC2另一个Web用户控件在VS添加一个新的项目并改变其基类WC1在后面
  5. 其代码在VS和阻力WC2添加新项目的设计视图中创建一个网页页面
  6. 运行页面,那么你将看到异常的代码隐藏在WC1

代码:

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

需要更多信息。你是否将控件声明式添加到ASCX文件或在代码隐藏文件中创建它们?你如何将用户控件添加到页面?一些代码示例也会有帮助。 – 2010-03-01 00:09:09

回答

1

如果您未将基本类型设置为WC1,则将控件添加到标记时,将在WC2的designer.cs中创建控件,并且这些控件都隐藏了从WC1继承的控件。

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

如果我误解了你,并且你试图继承基本控件的标记 ......你不能这么做,想想它将如何呈现,将会在何处?如果它是其他东西,请将您的标记和属性都发布到两个控件上,这可以清楚地说明发生了什么。

+0

继承标记可以像重写方法调用base.method()一样完成。例如,从WC1呈现标记的占位符WC2。如果WC2没有这样的占位符,则不会继承标记。 – 2010-03-16 13:11:17