【问题标题】:Visual Studio 2008 losing intellisense for ASCX with CodeBehind (but works for CodeFile)?Visual Studio 2008 使用 CodeBehind 失去对 ASCX 的智能感知(但适用于 CodeFile)?
【发布时间】:2010-12-03 05:01:50
【问题描述】:

我的 .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。阅读了许多像this great one 这样的文章后,我知道了各种新的部署模型,尽管除了 Web 应用程序项目(从 VS2003 转换而来,我们是 2005 年的后期采用者和 WAP 模型有在我们从 2003 年开始切换时已经添加了。)在许多 VS2005/8 项目中,我从来没有遇到过 CodeBehind= 的问题,直到这个 Intellisense 问题出现......尽管在这种情况下它没有帮助我正在部署到 SharePoint,这引入了一个全新的复杂程度。

由于我之前没有使用 CodeFile 进行部署,很可能我错过了一些我应该在构建时在 VS 中设置的选项,以便强制预编译。我只需要能够像今天一样部署为一组带有单个代码隐藏 DLL 的 ASPX/ASCX。这在今天与 CodeBehind= 一起工作......它只是有最初提到的 Intellisense 问题,这正是我想要解决的问题 :)

当我确定哪些文件可能与问题相关时,将发布更多信息...

【问题讨论】:

  • 您是否检查了文件上的构建操作?

标签: asp.net visual-studio visual-studio-2008 intellisense code-behind


【解决方案1】:

您是否检查过项目文件上的构建操作?我通过将 ArticleView.ascx.designer.cs 上的 Build Action 设置为 None 来复制您的问题。我也可以在使用 CodeFile 等时进行编译...,我 99% 确定这是您的问题。

【讨论】:

  • 哇,就是这样。其他人则非常接近原因——designer.cs 文件必须以某种方式不同步——但这就是确切的原因。我不知道它是怎么做到的,但是我在过去两周创建的所有类的设计器文件都设置为 Build = None。我可以理解为什么 CodeFile 会解决这个问题,但我还不明白为什么该项目在部署时完全可以工作:) 我猜设计器文件是按需生成的?哦,好吧
  • 复制起来很棘手,因为您不能这样构建,但是页面会加载,是的,ASP.NET 正在创建页面加载时缺少的声明。这就是运行中的 ASP.NET 管道。在 Sharepoint 上工作可能会使原因变得不那么明显,因为调试和部署是如此...不同,说得好点。
  • 感谢赏金。 :)
  • 谢谢理查德!我没有想到这一点。
  • 不错的理查德。我有一个类似的问题(.cs 文件中没有 Intellisense)并将我的类文件的“构建操作”属性更改为“编译”,然后它运行完美。为小费干杯。
【解决方案2】:

您缺少 [your-file].ascx.designer.cs 文件,该文件将您的控件链接到您的代码隐藏。

就像 CitizenBane 的建议一样,您需要右键单击文件(或文件夹,或整个 Web 项目)并选择“转换为应用程序”。 Visual Studio 将检查您的 ascx/aspx 文件中的服务器控件,并为您生成该设计器文件。

实际上我自己也遇到过这种情况,规模要大得多...C#: How to convert a Website project to a Web Project

检查答案。

【讨论】:

  • 谢谢 - 这是网络上的常见解释(“转换为 Web 应用程序”),但我发现了它并没有解决它。设计器文件确实存在,并且对在 ASCX 文件中命名的控件的引用确实在 .ASPX.CS 文件中起作用。但是,我认为您正在做某事,而我的项目可能不是“格式良好”。杰森也怀疑有类似的事情......我正在调查它,看看我是否可以重新创建文件或找出没有正确连接的地方!
  • 我在上面提供的链接中发现我的文件背后的代码没有正确命名空间。 “转换为 Web” 为我解决了这个问题,但如果您手动尝试修复它 - 这可能会导致 VS 失去设计器要求的自动生成。
【解决方案3】:

我以前也遇到过这种情况。尝试右键单击 ascx/aspx 并单击“转换为 Web 应用程序”。您可能只是缺少生成的控件。如果在上下文菜单中看不到它,请先删除设计器生成的文件。

【讨论】:

    【解决方案4】:

    CodeBehind 在 .NET 2.0 中已弃用。我相信只有

    为什么你不想编译你的代码?如果你编译你不必部署你的 .cs 文件...

    【讨论】:

    • 让我澄清一下 - 据我了解,仍然支持 CodeBehind,但首选 CodeFile。在任何情况下,我们都会编译我们的代码,事实上这就是为什么我想使用 CodeBehind 而不是 CodeFile,这似乎需要我部署 .ascx.cs 以及 .ascx 文件。我们现在部署的所有内容(以及我们想要继续部署的所有内容)都是 .ascx 文件,其中代码隐藏信息来自 1 个共享程序集。我是不是对 CodeFile 有误解?
    • 您是否在没有 .cs 文件的情况下测试过部署?如果您正在运行已编译的项目,则无需部署代码文件,只需部署 .aspx。修复、重建、重新部署、完成。
    • 谢谢,杰森。我确实对其进行了简短的测试,并且环境(一个 Sharepoint 站点)报告说页面无法加载,因为 CS 文件丢失了。但我可能只是缺少某种编译选项,所以我会调查一下!你所描述的正是我想要做的......如果可能的话,用 CodeFile 来做这件事很棒。
    • 确保您已包含 .cs 文件并在您的 .aspx 文件中引用它。也许尝试重建您的解决方案几次,然后尝试再次部署。它应该工作,我告诉你。哈。
    • 是的,我仍然得到:文件'/_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 ) ... 这是 ASPX 编译器告诉我,无论出于何种原因,它都需要部署 CS 文件。伙计,我现在讨厌 MS。我花了一天多的时间试图破译这个:(
    【解决方案5】:

    为什么你的 ascx 控件的代码背后是一个名为 aspx 的页面代码? UserControl (ascx) 通常有一个代码隐藏

    CodeBehind="ArticleView.ascx.cs" 
    

    而不是您列出的内容

    CodeBehind="ArticleView.aspx.cs"
    

    注意用户控件的 ascx 而不是 ascx。

    这可能是您的问题...一个简单的拼写错误或复制和粘贴错误。想到了几种可能性:

    1. 也许您使用继承自 System.Web.UI.Page 而不是 System.Web.UI.UserControl 的代码隐藏文件指定了上面指定的 ascx 控件(用户控件)(这可能会导致 Visual Studio 错误) .
    2. 您有 UserControl 指向同名 aspx 页面后面的代码。与 #1 类似的问题会导致 Visual Studio 感到困惑。
    3. 您的文件名为 ArticleView.ascx 和 ArticleView.aspx.cs。这可能会使 Visual Studio 感到困惑,因为我相信 VS 可能需要特定的命名约定。

    对于用户控件 (ascx),您的文件应命名为:

    • ArticleView.ascx (CodeBehind="ArticleView.ascx.cs" Inherits="[NAMESPACE].ArticleView")
    • ArticleView.ascx.cs(继承自 System.Web.UI.UserControl)
    • ArticleView.ascx.designer.cs

    对于 Web From (aspx),您的文件应命名为:

    • ArticlePage.aspx (CodeBehind="ArticlePage.aspx.cs" Inherits="[NAMESPACE].ArticlePage")
    • ArticlePage.aspx.cs(继承自 System.Web.UI.Page)
    • ArticlePage.aspx.designer.cs

    【讨论】:

    • +1 为好眼光,但它可能是一个错字,甚至不是真正的控件的名称等......
    • 谢谢,你的错字是完全正确的......但这是一个错字,因为我正在准备一个较小的示例案例以发布到 Stack Overflow。我试图清理东西并不小心输入了“ASPX”。控件和表单的命名如您所解释的那样。很好的收获!
    【解决方案6】:

    这只是我在 VS2010 中将 Web 应用程序项目升级到 .net 4.0 后发生的。

    答案是确保您在 web.config 的 system.web/compilation 部分设置了 targetFramework="4.0"

    <system.web>
        <compilation debug="true" targetFramework="4.0">
    </system.web>
    

    【讨论】: