我的 .ASCX 文件顶部有以下定义:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ArticleView.aspx.cs" Inherits="MyNameSpace.ArticleView" %>
在该控件中,我使用 <%= %> 块来引用我在代码隐藏文件中声明的成员。如果我编译和部署控件,它工作正常。但在 Visual Studio 中,我收到很多设计时错误,“{some variable} 在当前上下文中不存在。” Intellisense 也中断了:它适用于 UserControl 的成员,但找不到我自己声明的成员。还有其他问题。一般来说,一切都表明生成的 ASP.articleview_ascx 类不是从 MyNameSpace.ArticleView 类继承的。
我发现如果我将 CodeBehind 属性切换为“CodeFile”:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ArticleView.aspx.cs" Inherits="MyNameSpace.ArticleView" %>
突然 Intellisense 工作,所有设计时错误都消失了。但我不想进行运行时编译,也不想部署我的 .ASCX.CS 文件——所以我不能使用 CodeFile。
我检查了一些简单的东西,比如确保我的 CodeBehind 文件名正确并且 Inherits 类具有正确的命名空间等(并且由于在将属性更改为 CodeFile 后它可以正常工作,因此它们必须指向正确的位置。 ...)但我错过了什么?为什么它不能处理 CodeBehind 属性?
谢谢,
史蒂夫
更新:来自下面的一个线程 - 基本问题是,为什么不直接使用 CodeFile?答:当我尝试在我的文件中使用 CodeFile= 进行部署时,部署后我收到以下堆栈跟踪(完整显示):
/_layouts/Pages/ViewPage.aspx.cs' 不存在。在 System.Web.UI.Util.CheckVirtualFileExists(VirtualPath virtualPath) 在 System.Web.UI.TemplateParser.ProcessCodeFile(VirtualPath codeFileVirtualPath) 在 System.Web.UI.TemplateParser.ProcessMainDirectiveAttribute(String deviceName, String name, String value, IDictionary parseData )
(这是来自对 /_layouts/Pages/ViewPage.aspx 的请求。ViewPage 是具有其他几个控件的页面,包括我在原始示例中提到的 ArticleView。它恰好是第一个失败的文件 - 如果我回到ViewPage 中的 CodeBehind=,然后包含 ASCX 和 CodeFile= 将以相同的方式失败。)这似乎是页面编译器抱怨,因为在任何加载的 DLL 中都找不到继承的代码隐藏类,所以它期望必须有一个 CS文件进行按需编译。
这里的问题是我不想部署 CS 文件,只是 ASPX/ASCX。阅读了许多类似这篇很棒的文章后,我知道了各种新的部署模型,尽管我从来没有使用过 Web 应用程序项目(从 VS2003 转换而来,我们是 2005 年的后期采用者和 WAP 模型)在我们从 2003 年开始切换时已经添加了。)在许多 VS2005/8 项目中,我从来没有遇到过 CodeBehind= 的问题,直到这个 Intellisense 问题出现......虽然在这种情况下它没有帮助我正在部署到 SharePoint,这引入了一个全新的复杂程度。
由于我之前没有使用 CodeFile 进行部署,很可能我错过了一些我应该在构建时在 VS 中设置的选项,以便强制进行预编译。我只需要能够像今天一样部署为一组带有单个代码隐藏 DLL 的 ASPX/ASCX。这在今天与 CodeBehind= 一起工作......它只是有最初提到的 Intellisense 问题,这确实是我想要解决的问题 :)
当我确定哪些文件可能与问题相关时,将发布更多信息......