无法从Web应用程序项目中的代码隐藏页面访问自定义继承的webcontrol实例

时间:2010-03-02 19:32:29

标签: asp.net inheritance web-controls web-application-project

我继承自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:

澄清一下,我想要实现的是:

  1. Web应用程序项目
  2. 同一程序集中的继承Web控件类文件(即未从单独编译的DLL引用)
  3. 通过设计时标记添加到页面的控件
  4. 从页面代码隐藏
  5. 引用的控件实例 编辑:重读布莱恩的评论后,我终于明白了。实际上非常简单:您只需要将 Assembly =“WebApplication1”添加到标记中的<%@ Register%> 指令中添加“WebApplication1”。命名空间指令的前缀。所以:

    <%@ Register Assembly="WebApplication1" TagPrefix="aspSample" Namespace="WebApplication1.Samples.AspNet.VB.Controls" %>
    

    现在,无论是将控件的类文件放在App_Code还是其他任何地方,通过标记实例化控件并从代码隐藏中访问实例都应该没有问题。

    Jordan Rieger

2 个答案:

答案 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。