我继承自ASP.NET WebControl以添加一些额外的功能。我在一个空白的ASP.NET网站(通过File> New Web Site ...创建)中测试了我的控件,它运行正常。但是当我将它添加到Web应用程序项目(创建throgh文件>新项目...> Visual Basic> Web> ASP.NET Web应用程序)时,我无法使其工作。我个人更喜欢Web站点易于开发,但我现在正在使用的项目领导者希望将它保留为Web应用程序(他们喜欢将所有页面代码预编译到Bin文件夹中的单个DLL中。)
为了隔离问题,我尝试使用简单的MSDN Walkthrough: Developing and Using a Custom Server Control重现它。令我惊讶的是,我在那里遇到了同样的问题:如果你将它构建到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:
澄清一下,我想要实现的是:
<%@ Register Assembly="WebApplication1" TagPrefix="aspSample" Namespace="WebApplication1.Samples.AspNet.VB.Controls" %>
现在,无论是将控件的类文件放在App_Code还是其他任何地方,通过标记实例化控件并从代码隐藏中访问实例都应该没有问题。
Jordan Rieger
答案 0 :(得分:1)
你有一些不稳定的东西。有几件事要检查......
一,确保您的代码没有CodeFile指令。它应该编译到与页面类相同的程序集中。确保Inherits指令正确。这听起来很像你正在修改一个不是你认为的类。
二,确保设计器文件为控件使用正确的类型声明。如果它说“WebControl”或你的类型旁边的东西,我怀疑,这是一个问题。您可能需要通过在“项目属性”中设置应用程序根来告诉Visual Studio此控件的代码。这就是Visual Studio如何知道如何在设计时解析“〜”路径。
如果这不起作用......发布一些代码。
<强>更新强>:
好的,你得到原始错误的原因是控件没有在设计器文件中声明。如果它不在设计器文件中,那么它不存在,因此你得到这个错误:“WelcomeLabel1'不是'WebApplication1._Default'的成员。这可能发生的一个原因是你不是注册控件,或者没有正确注册它......所以Visual Studio不知道如何处理它。就像声明一些没有定义的随机元素一样:
<bp:WhatIsThis ID="someID" runat="server">
Visual Studio不会在此更新您的.designer文件,因为它不知道此对象代表什么。我猜这里正在发生同样的事情。
更新 2: 您必须在项目中包含.cs文件。步骤可能会遗漏这一步骤,因为它针对的是网站,而不是WAP。这就是你的命名空间为空的原因。
答案 1 :(得分:0)
有时打开设计器会将其正确添加到包含控件引用的designer.cs文件中。这可能是错过的。不知道为什么,对我来说很好......
是否存在构建错误或编译错误,或者@Page指令是否显示错误?
HTH。