从自定义用户控件基类派生用户控件的控制权

5
我想创建一个名为DerivedUserControl.ascx的用户控件,它派生自另一个用户控件BaseUserControl.ascx。基础用户控件按要求派生自System.Web.UI.UserControl。这些用户控件位于不同的文件夹中。由于我正在使用Visual Studio 2010 Web Site项目(无法切换到Web应用程序项目),因此这些用户控件没有定义在命名空间中。
我的问题是,当我尝试编译项目时,派生用户控件的基类无法解析(显然是因为编译器不知道哪个.ascx文件定义了基类)。有没有办法解决这个问题?
我已经尝试了我能想到的一切,但没有成功。非常感谢任何帮助。

BaseUserControl.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="BaseUserControl.ascx.cs" Inherits="BaseUserControl" %>

BaseUserControl.ascx.cs

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

    }
}

DerivedUserControl.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="DerivedUserControl.ascx.cs" Inherits="DerivedUserControl"  %>

DerivedUserControl.ascx.cs

public partial class DerivedUserControl : BaseUserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
}

错误

The type or namespace name 'BaseUserControl' could not be found
4个回答

2
使用 ASP.NET 网站(而不是 Web 项目)时,您需要向 DerivedUserControl.ascx 添加 <@Reference> 元素。
从 MSDN 中可以了解到:

指示另一个用户控件、页面源文件或位于某个虚拟路径的任意文件应动态编译并与声明此指令的当前 ASP.NET 文件(Web 页面、用户控件或主控页)链接。

添加以下代码即可: <%@ Reference VirtualPath="~/FolderName1/BaseUserControl.ascx" %> 完成后,您可以这样引用它。
public partial class DerivedUserControl : ASP.foldername1.baseusercontrol_ascx

其中FolderName1是包含您的BaseUserControl的文件夹名称。


哇,这些似乎使用ASP.base_baseusercontrol_ascx有效。 - CodeZombie
µłæńÉåĶ¦Żbaseµś»BaseUserControl.ascxµēĆÕ£©µ¢ćõ╗ČÕż╣ńÜäÕÉŹń¦░ŃĆé - Conrad Frix

1
创建一个名为 BaseUserControl.cs 的基类的普通类(.cs)。
public class BaseUserControl : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
}

那将是一个不错的解决方案。不幸的是,我无法修改基类,因为它是 CMS 的一部分。 - CodeZombie
在不同情况下,这是一个技术上合理的修复方案。 - Patrick

0

这段代码无法编译:

namespace MyBase
{
    public class BaseUserControl : System.Web.UI.UserControl
    { }
}
public class DerivedUserControl : BaseUserControl
{ }

这个可以编译:

namespace MyBase
{
    public class BaseUserControl : System.Web.UI.UserControl
    { }
}
public class DerivedUserControl :MyBase.BaseUserControl
{ }

基本上就是将命名空间的名称加上点号再加上你的基类的名称。 祝你好运!


默认情况下,Web Site 项目中没有设置命名空间。 - CodeZombie

0
问题似乎是DerivedUserControl.ascx无法访问包含BaseUserControl的DLL。请确保你添加了对该dll的引用,并将"copy local"设置为true。

我使用网站项目,因此我无法获得编译的程序集(dll)以供引用。 - CodeZombie
尝试将路径放入Inherits中,以便它可以找到不在同一目录中的代码。 - Shiraz Bhaiji
在一个 WebSite 项目中,程序集是动态生成的。 - Conrad Frix

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