类库中的用户控件

5
我正在将一个1.1的项目转换为2.0,但在一些用户控件上遇到了问题。原始项目中有一个类库项目和网站项目。在类库项目中,有一个名为UserControls的文件夹,其中包含多个ascx文件及其代码后台文件。我希望保持相同的结构,所以将这些用户控件带入我的新解决方案中,放到一个独立的类库项目中。我将其从一个完整的类改为部分类,并将CodeBehind改为页面的CodeFile。在旧的用户控件中,所有的Web控件都像下面这样列出。
protected System.Web.UI.WebControls.DropDownList _findModeList;

我以为在.net 2中使用CodeFile属性就不需要这样做了,但是当我省略它时,它无法编译。

然而,当我包含它时,它可以编译,但是在代码文件中尝试使用_findModeList时会出现“对象引用未设置为对象的实例”错误。

在.net 2.0及以上版本中,是否可以将用户控件放入类库中?

4个回答

3

不是真的。每个使用它的Web应用程序项目都应该包含.ASCX文件。为了避免重复,您可以将用户控件存储在类库的文件夹中,并使用Visual Studio的“添加为链接”功能。

在Web应用程序的上下文菜单中选择“添加现有项”,选择用户控件,而不是单击“添加”按钮,请单击该按钮中的箭头并选择“添加为链接”。


1

你正在开发 Web 应用程序项目吗?还是网站?这很令人困惑,我知道...

如果你正在使用 WAP,请使用 CodeFile,并让 ASP.NET 为你生成 .designer.cs 文件。不要在 .acsx 中声明对象。当你在 CodeFile 引用的 .cs 文件中显式声明 _findModeList 时,你正在声明一个新的/不同的 DropDownList。这就是为什么你得到空引用...它还没有被初始化。如果你没有 .designer 文件,请右键单击 Solution Explorer 中的 .ascx 并单击“转换为 Web 应用程序”。

如果你正在处理的是站点而不是 WAP,请使用 CodeBehind 属性。它将继续像在 ASP.NET 1.1 中那样工作并即时编译。

要使控件完全存在于 DLL 中,请使用“定制控件”而不是用户控件。这又令人困惑。


1

实际上,您可以尝试创建新的Web应用程序项目而不是创建新的网站,因为这两者是不同的项目。

创建Web应用程序后,只需创建您的用户控件(.ascx)。之后,您可以尝试重新构建Web应用程序。完成后,您可以浏览到bin目录,那里应该有您的Web应用程序的dll文件。现在,您可以在另一个网站/ Web应用程序项目中使用此dll。只需添加对此dll的引用即可。


1

你尝试过在<%@ Control %>标记中更改/添加Inherits属性吗?

 <%@ Control Language="C#" CodeBehind="<PathToTheFile>" Inherits="namespace.and.classname" %>

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