如何从另一个UserControl继承一个UserControl?

7

是否可以从另一个用户控件继承一个用户控件?

我想实现的是一个用户控制从另一个用户控制继承。所以,我有一个baseusercontrol.ascx,它只有文本“Stuff”。然后我有另一个用户控件childusercontrol.ascx继承自baseusercontrol.ascx。如果我不在childusercontrol.ascx中做任何更改,我希望baseusercontrol.ascx中的文本显示为“Stuff”。

而且我应该能够在派生类中扩展基本用户控件的功能。

我还尝试过像this这样的方法,但在我的情况下不够用。

现在我的childusercontrol.ascx如下所示:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="childusercontrol.ascx.cs" Inherits="test_childusercontrol" %>
<%@ Register src="baseusercontrol.ascx" tagname="baseusercontrol" tagprefix="uc1" %>

以下是childusercontrol.ascx.cs:

public partial class test_childusercontrol : baseusercontrol
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }   
}

当我浏览这个页面时,我遇到了错误提示:
Object reference not set to an instance of an object.
Description : An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details : System.NullReferenceException: Object reference not set to an instance of an object.

有什么线索吗?


你能分享baseusercontrol.ascx的代码吗?你的错误显示在特定行号处有一个空引用。我怀疑你有一个空引用。o_O - Ed Chapel
你需要查看堆栈跟踪,就像异常消息告诉你的那样。几乎所有NullReferenceException的情况都是相同的。请参阅“.NET中的NullReferenceException是什么?”获取一些提示。 - John Saunders
1
另外,用户控件不应该被继承。最好的方法是创建继承“UserControl”的基类,但不包含任何标记(没有.ascx文件)。 - John Saunders
1个回答

5

我已经亲自测试了这种情况。实际上你无法从一个具有自己ASCX代码的基类UserControl中继承

然而,你可以在(可能是抽象的)基类(没有ASCX)中实现一些基本功能,例如:

public class BaseClass:UserControl
{
    public String BaseGreeting { get { return "Welcomebase!"; }}
}

然后在具有自己的ASCX文件的具体UserControl类中,使用此基类的方法和属性。

public partial class childusercontrol : BaseClass
{
    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        Greeting = base.BaseGreeting; //As initial value
    }
    public String Greeting
    {
        get { return LabelGreeting.Text; }
        set { LabelGreeting.Text = value; }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接