2

我从 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:

为了澄清,我试图实现的是:

  1. 网络应用项目
  2. 在同一程序集中继承 Web 控件类文件(即不从单独编译的 DLL 中引用)
  3. 通过设计时标记添加到页面的控件
  4. 从页面代码隐藏引用的控件实例

编辑:重新阅读布莱恩的评论后,我终于明白了。实际上非常简单:您所要做的就是将Assembly="WebApplication1"添加到标记中的<%@Register%>指令中,然后添加“WebApplication1”。命名空间指令的前缀。所以:

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

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

乔丹·里格

4

2 回答 2

1

你有一些奇怪的东西。有几件事要检查...

一,确保您的代码没有 CodeFile 指令。它应该被编译成与您的页面类相同的程序集。确保 Inherits 指令正确。这听起来很像您正在修改一个不是您认为的类。

第二,确保设计器文件为您的控件使用正确的类型声明。如果它显示“WebControl”或您的类型之外的其他内容,我怀疑这是一个问题。您可能需要通过在项目属性中设置应用程序根来告诉 Visual Studio 该控件的代码在哪里。这就是 Visual Studio 知道如何在设计时解析“~”路径的方式。

如果那不起作用...发布一些代码。

更新
好的,您收到原始错误的原因是该控件未在设计器文件中声明。如果它不在设计器文件中,则它不存在,因此您会收到此错误:“WelcomeLabel1' is not a member of 'WebApplication1._Default'。发生这种情况的一个原因是您没有注册控件,或者没有正确注册它......所以Visual Studio不知道如何处理它。这就像声明一些没有定义的随机元素:

<bp:WhatIsThis ID="someID" runat="server">

Visual Studio 不会在此处更新您的 .designer 文件,因为它不知道该对象代表什么。我猜同样的事情正在这里发生。

更新2:您必须在项目中包含 .cs 文件。演练中可能缺少此步骤,因为它针对的是网站,而不是 WAP。这就是为什么你的命名空间是空的。

于 2010-03-02T20:34:55.243 回答
0

有时打开设计器会使其正确添加到包含控件引用的 Designer.cs 文件中。这就是可能缺少的。不知道为什么,对我来说很好......

是否存在构建错误或编译错误,或者 @Page 指令是否显示错误?

HTH。

于 2010-03-02T20:12:12.947 回答