Visual Studio 2008 使用 CodeBehind 失去對 ASCX 的智能感知(但適用於 CodeFile)?
我的 .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 問題,這確實是我想要解決的問題 :)
當我確定哪些文件可能與問題相關時,將發布更多資訊……
您是否檢查過項目文件上的建構操作?我通過將 ArticleView.ascx.designer.cs 上的 Build Action 設置為 None 來複製您的問題。我也可以在使用 CodeFile 等時進行編譯…,我 99% 確定這是您的問題。
你錯過了
$$ your-file $$.ascx.designer.cs 文件,它將您的控制項連結到您的程式碼隱藏。 就像 CitizenBane 的建議一樣,您需要右鍵點擊文件(或文件夾,或整個 Web 項目)並選擇“轉換為應用程序”。Visual Studio 將檢查您的 ascx/aspx 文件中的伺服器控制項,並為您生成該設計器文件。
實際上,我自己也遇到過這個問題,規模要大得多… C#:如何將網站項目轉換為 Web 項目
檢查答案。