我从 ASP.NET WebControl 继承来添加一些附加功能。我在一个空白的 ASP.NET 网站(通过文件 > 新网站...创建)中测试了我的控件,它运行良好。但是当我将它添加到 Web 应用程序项目(通过文件 > 新项目...> Visual Basic > Web > ASP.NET Web 应用程序创建时,我无法让它工作。我个人更喜欢网站以便于开发,但是我现在正在与之合作的项目领导希望将其保留为 Web 应用程序(他们喜欢它将所有页面代码预编译到 Bin 文件夹中的单个 DLL 中的方式。)
为了隔离问题,我尝试使用简单的MSDN 演练重现它:开发和使用自定义服务器控件。令我惊讶的是,我在那里遇到了同样的问题:如果将其构建到 ASP.NET Web 应用程序项目中,然后尝试从页面的代码隐藏中访问控件的实例,则会收到编译错误 BC30456: 'WelcomeLabel1 ' 不是 'WebApplication1._Default' 的成员。例如,在页面加载中,写:
Me.WelcomeLabel1.Text = "foo"
但是,如果您只是删除后面的那行代码,它就会正确编译,并且浏览器会显示带有正确格式标签的页面。对我来说,这是编译器/框架中的一个错误,因为如果控件被正确注入页面,它应该始终在代码隐藏中可用,对吗?
有任何想法吗?我想我可以按照演练中进一步的建议将我的控件编译成一个程序集,但这似乎有点矫枉过正。
有趣的是,我可以使用 FindControl 来获取对 WelcomeLabel 的引用,但我无法将其转换为适当的类型。这样做会导致错误“无法将'Samples.AspNet.VB.Controls.WelcomeLabel'类型的对象转换为'WebApplication2.Samples.AspNet.VB.Controls.WelcomeLabel'。” 我已经尝试了我能想到的命名空间和导入的所有组合,甚至手动将声明添加到 Designer.vb 文件,但我无法让它工作,除非我当然切换到一个网站项目,我做不到。
更新 1.1:
为了澄清,我试图实现的是:
- 网络应用项目
- 在同一程序集中继承 Web 控件类文件(即不从单独编译的 DLL 中引用)
- 通过设计时标记添加到页面的控件
- 从页面代码隐藏引用的控件实例
编辑:重新阅读布莱恩的评论后,我终于明白了。实际上非常简单:您所要做的就是将Assembly="WebApplication1"添加到标记中的<%@Register%>指令中,然后添加“WebApplication1”。命名空间指令的前缀。所以:
<%@ Register Assembly="WebApplication1" TagPrefix="aspSample" Namespace="WebApplication1.Samples.AspNet.VB.Controls" %>
现在,您应该可以通过标记实例化控件并从代码隐藏访问实例,无论您将控件的类文件放在 App_Code 中还是其他任何地方。
乔丹·里格