Visual Studio 2008使用CodeBehind失去ASCX的intellisense(但适用于CodeFile)?

时间:2009-10-02 02:16:21

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

我的.ASCX文件顶部有以下定义:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ArticleView.aspx.cs" Inherits="MyNameSpace.ArticleView" %>

在该控件中我使用&lt;%=%&gt;阻止引用我在代码隐藏文件中声明的成员。如果我编译和部署控件,它工作正常。但是在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文件名是正确的&amp; Inherits类具有正确的命名空间等(并且因为它在将属性更改为CodeFile后正常工作,所以它们必须指向正确的位置....)但是我错过了什么?为什么它不能处理CodeBehind属性?

谢谢,
史蒂夫


更新:从下面的一个帖子 - 基本问题是,为什么不使用CodeFile?答:当我尝试在我的文件中使用CodeFile =进行部署时,在部署之后,我收到以下堆栈跟踪(完整呈现):

  

/ _ layouts / Pages / ViewPage.aspx.cs'不存在。位于System.Web.UI.UI.TemplateParser.ProcessMainDirectiveAttribute的System.Web.UI.UI.TemplateParser.ProcessCodeFile(VirtualPath codeFileVirtualPath)上的System.Web.UI.Util.CheckVirtualFileExists(VirtualPath virtualPath)处(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年的后期采用者&amp; the从2003年开始我们已经添加了WAP模型。)在许多VS2005 / 8项目中,我从来没有遇到过CodeBehind =的问题,直到这个Intellisense问题出现......虽然它没有帮助在这种情况下,我正在部署到SharePoint,这引入了一个全新的复杂程度。

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

当我确定哪些文件可能与问题相关时,会发布更多内容......

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

之前发生在我身上。尝试右键单击ascx / aspx并单击“转换为Web应用程序”。您可能只是缺少生成的控件。如果在上下文菜单中没有看到它,请先删除设计器生成的文件。

答案 2 :(得分:4)

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

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

我实际上自己遇到了这个问题,范围要大得多...... C#: How to convert a Website project to a Web Project

检查答案。

答案 3 :(得分:3)

在.NET 2.0中不推荐使用CodeBehind。我相信只有&lt; = 1.1使用“CodeBehind”。现在它就像你说的那样是“CodeFile”。

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

答案 4 :(得分:2)

为什么你的ascx控件背后有代码作为aspx命名页面代码? UserControl(ascx)通常具有

的代码隐藏
CodeBehind="ArticleView.ascx.cs" 

而不是您列出的内容

CodeBehind="ArticleView.aspx.cs"

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

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

  1. 也许您使用从System.Web.UI.Page继承的代码隐藏文件而不是System.Web.UI.UserControl(可能导致Visual Studio错误)使用上面指定的ascx控件(用户控件)
  2. 您有UserControl指向同名aspx页面后面的代码。与#1类似的问题会导致Visual Studio陷入困境。
  3. 您的文件名为ArticleView.ascx和ArticleView.aspx.cs。这可能会使Visual Studio感到困惑,因为我认为VS可能需要特定的命名约定。
  4. 对于用户控件(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

答案 5 :(得分:1)

在将Web应用程序项目升级到.net 4.0之后,VS2010中发生了这种情况。

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

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