9

我的 .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 问题,这确实是我想要解决的问题 :)

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

4

6 回答 6

5

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

于 2009-10-15T02:01:41.523 回答
4

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

于 2009-10-13T18:04:38.493 回答
4

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

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

实际上,我自己也遇到过这个问题,规模要大得多... C#:如何将网站项目转换为 Web 项目

检查答案。

于 2009-10-14T14:42:30.323 回答
3

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

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

于 2009-10-02T02:35:33.020 回答
2

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

CodeBehind="ArticleView.ascx.cs" 

而不是你列出的

CodeBehind="ArticleView.aspx.cs"

注意用户控件的 aspx 而不是 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
于 2009-10-15T00:57:50.753 回答
1

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

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

IE

<system.web>
    <compilation debug="true" targetFramework="4.0">
</system.web>
于 2012-01-12T08:59:52.297 回答