我正在将1.1项目转换为2.0,并且遇到了一些用户控件的问题。
在原始项目中,有一个类库项目和网站项目。在类库项目中,有一个名为UserControls的文件夹,其中有几个ascx文件及其代码隐藏文件。
我想保持相同的结构,所以我将这些用户控件引入我的新解决方案中的单独的类库项目中。我将它从完整类更改为部分类,并将CodeBehind更改为页面的CodeFile。
在旧用户控件中,User控件中的所有Web控件都列出如下
protected System.Web.UI.WebControls.DropDownList _findModeList;
等
我认为它是.net 2并且使用CodeFile属性,我可能不需要这样做但是当我省略它时它不会编译。
但是,当我包含它时,它会编译,但我得到“对象引用未设置为对象的实例”。尝试在代码文件中使用_findModeList时出错。
是否可以将用户控件放在.net 2.0中的类库中?
答案 0 :(得分:3)
不是真的。 .ASCX文件应包含在使用它的每个Web应用程序项目中。为避免重复,您可以将UserControl存储在类库的文件夹中,并使用Visual Studio的“添加为链接”功能。
在Web应用程序的上下文菜单中选择“添加现有项目”,选择用户控件,而不是单击“添加”按钮,单击该按钮中的箭头并选择“添加为链接”。
答案 1 :(得分:1)
您是否正在使用Web应用程序项目?还是一个网站?令人困惑,我知道......
如果您正在使用WAP,请使用CodeFile并让ASP.NET为您生成.designer.cs文件。不要声明.acsx中的对象。当您在CodeFile引用的.cs文件中显式声明_findModeList时,您将声明一个新的/不同的DropDownList。这就是为什么你得到空引用...它尚未初始化。如果您没有.designer文件,请右键单击解决方案资源管理器中的.ascx,然后单击“转换为Web应用程序”。
如果您使用的是Site而不是WAP,请使用CodeBehind属性。它将继续像ASP.NET 1.1一样工作并即时编译。
要使控件完全存在于DLL中...使用“自定义控件”而不是用户控件。再次,令人困惑。
答案 2 :(得分:1)
实际上您可以尝试创建新的 Web应用程序项目而不是创建新的网站,因为这两者之间是不同的项目。
创建Web应用程序后,只需创建用户控件(.ascx)。之后,您可以尝试重建Web应用程序。完成后,您可以浏览到您的bin目录,您的Web应用程序应该有dll。现在,您可以在其他网站/ Web应用程序项目中使用此dll。只需添加对此dll的引用。
答案 3 :(得分:1)
您是否尝试在<%@ Control%>中更改/添加Inherits属性?标记
<%@ Control Language="C#" CodeBehind="<PathToTheFile>" Inherits="namespace.and.classname" %>