9

我有我的.ASCX文件的顶部如下定义:Visual Studio 2008与CodeBehind(但适用于CodeFile)ASCX失去intellisense?

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

在这种控制我利用<%=%>块来指代我在后台代码已经声明会员文件。如果我编译和部署控件,它工作正常。但在Visual Studio中,我收到了很多设计时错误,“当前上下文中不存在{some variable}。” Intellisense也打破了它:它适用于UserControl的成员,但找不到我自己的声明成员。还有其他问题。一般来说,所有事情都指向这样一个事实,即生成的ASP.articleview_ascx类不知何故从MyNameSpace.ArticleView类继承。

我发现,如果我切换代码隐藏属性“的CodeFile”:

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

突然智能感知工作,所有的设计时错误消失。但我不想做运行时编译,或者部署我的.ASCX.CS文件 - 所以我不能使用CodeFile。

我检查了简单的东西,比如确保我的CodeBehind文件名是正确的& Inherits类有适当的命名空间等等(因为它在将属性更改为CodeFile之后正常工作,那些必须指向正确的地方....)但是我错过了什么?为什么它不能处理CodeBehind属性?

感谢,
史蒂夫


更新:从下一个话题 - 基本的问题是,为什么不使用的CodeFile?答:当我尝试使用的CodeFile =在我的文件部署,部署我收到下面的堆栈跟踪后(在其整体呈现):

/_layouts/Pages/ViewPage.aspx.cs'不存在。 System.Web.UI.TemplateParser.ProcessMainDirectiveAttribute(String deviceName,String name,String value,IDictionary parseData)在System.Web.UI.TemplateParser.ProcessCodeFile(VirtualPath codeFileVirtualPath)上的System.Web.UI.Util.CheckVirtualFileExists(VirtualPath virtualPath) )

(这是来自于/_layouts/Pages/ViewPage.aspx的请求。的ViewPage的是,有几个其他控件,包括在我原来的例子中提到的ArticleView的页面。这恰好是第一个文件失败 - 如果我回到ViewPage中的CodeBehind =,那么带有CodeFile =的ASCX将以同样的方式失败。)这似乎是页面编译器的抱怨,因为在任何加载的DLL中都找不到继承的代码隐藏类,所以它预计必须有一个CS文件来进行按需编译。

这里的问题是我不想部署CS文件,只是ASPX/ASCX。阅读了许多文章,如this great one我知道各种新的部署模式,虽然我从来没有使用任何东西,但除了一个Web应用程序项目(从VS2003转换,我们是2005年的最新采用者& WAP模型已经)在许多VS2005/8项目中,我从来没有遇到过CodeBehind =的问题,直到这个Intellisense问题出现......尽管在这种情况下我没有帮助,部署到SharePoint,这引入了一个全新的复杂程度。

由于我之前没有部署过使用CodeFile,所以很可能我在构建时错过了一些选项,以便强制进行预编译。我只需要像我今天那样部署一组带有单个代码隐藏DLL的ASPX/ASCX。这就是今天与CodeBehind = ...它只是最初提到的Intellisense问题,这真的是我想修复:)

将发布更多,因为我确定哪些文件可能与问题相关...

+0

你检查过生成操作上的文件? – 2009-10-15 01:22:44

回答

5

你检查你的项目文件的生成操作?通过将ArticleView.ascx.designer.cs上的生成操作设置为无,我重复了您的问题。我也可以在使用CodeFile时编译,等等......,我99%确定这是你的问题。

+0

哇,就是这样。其他人非常接近原因 - designer.cs文件必须以某种方式不同步 - 但这是确切的原因。我不知道它是如何得到的,但是我在过去两周创建的所有类的设计器文件都设置为Build = None。我可以理解为什么CodeFile会解决这个问题,但我还不明白为什么这个项目在部署时完全可以工作:)我猜设计器文件是按需生成的?哦, – 2009-10-15 04:31:10

+1

复制很复杂,因为你不能这样构建,但页面会加载并且是,ASP.NET正在创建页面加载时缺失的声明。这是ASP.NET管道的实际操作。在Sharepoint上工作可能会导致这种情况不那么明显,因为调试和部署如此不同以至于不好。 – 2009-10-15 15:18:43

+0

感谢赏金奖励。 :) – 2009-10-16 00:04:00

3

CodeBehind在.NET 2.0中不推荐使用。我相信只有< = 1.1使用“CodeBehind”。正如你所说,现在它是“CodeFile”。

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

+0

让我澄清 - 据我所知,CodeBehind仍然受支持,但CodeFile是首选。在任何情况下,我们都会编译我们的代码,实际上这就是为什么我要使用CodeBehind而不是CodeFile,这似乎要求我部署.ascx.cs以及.ascx文件。我们现在部署的所有内容(以及我们希望继续部署的所有内容)都是.ascx文件,其中代码隐藏信息来自1共享程序集。我误解CodeFile吗? – 2009-10-02 02:52:56

+0

你测试过没有你的.cs文件的部署吗?如果您正在运行已编译的项目,则无需部署代码文件,只需使用.aspx。修复,重建,重新部署,完成。 – Jason 2009-10-02 03:47:53

+0

谢谢,杰森。我做了一个简短的测试,环境(一个Sharepoint网站)报告说由于CS文件丢失,无法加载页面。但是我可能会错过某种编译选项,所以我会研究它!你所描述的正是我想要做的......如果可能的话,用CodeFile来做到这一点非常棒。 – 2009-10-05 04:06:47

4

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

4

您错过了[your-file] .ascx.designer.cs文件,它将您的控件链接到代码隐藏文件。

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

我居然碰到了这个自己,在一个大得多的规模... C#: How to convert a Website project to a Web Project

检查答案。

+1

+1,因为它比我更好地解释它! – CitizenBane 2009-10-14 15:30:55

+0

嗯,我是投票答案的人 – eduncan911 2009-10-14 17:54:33

+0

谢谢 - 这是网上常见的解释(“转换为Web应用程序”),但我发现它并没有解决它。 ,并且ASCX文件中提到的控件对.ASPX.CS文件起作用,但我认为你正在做些什么,而且我的项目可能不是“良构”.Jason也怀疑类似的东西。 。我正在研究它是否可以重新创建文件或找出没有正确连接的文件 – 2009-10-14 23:48:25

2

为什么你将ascx控件的代码作为一个名为page代码的后台? 一个用户控件(ASCX)通常具有

CodeBehind="ArticleView.ascx.cs" 

什么,而不是你列出

CodeBehind="ArticleView.aspx.cs" 

注意的ASPX,而不是用户控件的ASCX代码隐藏。

这可能是您的问题...一个简单的错字或复制粘贴错误。夫妇可能性浮现在脑海:以上使用隐藏文件代码是从System.Web.UI.Page而不是System.Web.UI.UserControl(继承指定

  1. 也许你有ascx控件(用户控件)这可能会导致Visual Studio错误)。
  2. 您的UserControl指向后面的代码,以获得相同的名称aspx页面。类似的问题#1,这将导致Visual Studio得到所有困惑。
  3. 您的文件名称为ArticleView.ascx和ArticleView.aspx.cs。这可能会混淆Visual Studio,因为我相信VS可能会期望一个特定的命名约定。

用户控件(ASCX)文件应该被命名为:

  • ArticleView.ascx(代码隐藏= “ArticleView.ascx.cs” 继承= “[NAMESPACE] .ArticleView”)
  • ArticleView.ascx.cs(继承自System.Web.UI.UserControl)
  • ArticleView.ascx.designer。CS

对于Web从(CSS)文件应该被命名为:

  • ArticlePage.aspx(代码隐藏= “ArticlePage.aspx.cs” 继承= “[NAMESPACE] .ArticlePage”)
  • ArticlePage.aspx.cs(继承自System.Web.UI.Page)
  • ArticlePage.aspx.designer.cs
+0

+1对于好的眼睛,但它可能是一个错字,甚至没有真正的控件的名称等...... – 2009-10-15 02:03:13

+0

谢谢,你完全正确的错字...但这是一个错字发生在我准备一个较小的示例用于发布到堆栈溢出。我试图清理东西,并意外地键入“ASPX”。控件和表单按照您的解释进行命名。虽然很棒! – 2009-10-15 04:24:03

1

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

的答案是,以确保你有targetFramework =“4.0”在web.config中关于对System.Web /编译部分设置

<system.web> 
    <compilation debug="true" targetFramework="4.0"> 
</system.web> 
相关问题