2010-04-07 175 views
2

通常我們都這樣使用using System.Linq;using System.Data.Linq;例如在代碼隱藏,並希望我們能夠達成這些命名空間從源代碼像<%= Something.First()%>的成員,但是當我寫的,asp.net表示無法找到First()在上下文中,我不得不添加<%@ Import Namespace="System.Linq"這看起來很奇怪,但它解決了。由於它們針對同一個類,爲什麼它們都需要單獨的命名空間導入。命名空間問題

代碼隱藏:

using System; 
using System.Data.Linq; 
using System.Linq; 
using System.Text 

namespace Something 
{ 
    class Items : System.Web.UI 
    { 
     //... 
    } 

} 

而且我需要補充的HTML源部分

<%@Import Namespace="System.Linq"%> 

我認識一些錯誤相同的LINQ的命名空間或這是一些在asp.net中的一種錯誤。我認爲當頁面正在編譯時,asp.net將這兩個類組合起來,並將html源代碼轉換爲cs類,並指示Control c= new Control();層次結構中的控件。

在此先感謝。

PS:我想在Items.aspx達到例如First(),一切我提及一個asp.net頁面是Items.aspx

+0

你的意思是首先()是在此頁面後面的Items類中定義的方法? – 2010-04-07 16:44:00

+0

我的意思是它是System.Linq的擴展方法,但我無法達到它,因爲我不得不在源html上聲明它以查看成員。在代碼隱藏中導入它似乎不適用於源代碼部分。 – Tarik 2010-04-07 16:46:09

+0

正確。它們分開編譯。看到我下面的評論。 – 2010-04-07 16:50:50

回答

3

您必須在兩地指定的命名空間。這是正常的行爲。編譯器需要這樣做,以便在將它們合併到一個類並進行實際編譯之前,分別預編譯aspx頁面和代碼隱藏頁面。

默認情況下,aspx頁面中已包含一些常用名稱空間,因此您無需導入它們。但在你的情況下,你需要導入Linq。

編輯:正如Joel Coehoorn所說,你可以添加到Web.config的默認命名空間列表中,如果你不想手動添加它們在aspx頁面中。

0

First是不是在類中的方法,但擴展方法在System.Linq命名空間中定義。即使您也可以在後面的代碼中使用此擴展方法,但這並不意味着ASP.NET編譯器可以在沒有提示的情況下找到擴展方法 - 因此也就是<%@ Imports ... %>指令。

請注意,ASP.NET編譯(即aspx)與編譯後面的代碼是分開的。後者在您構建項目時運行;前者在您首次訪問該頁面時運行,或者使用「發佈...」或Web部署項目對其進行預編譯。因此,如果你在兩個地方使用它,每個編譯器都需要被告知在哪裏找到這個擴展方法。

+0

是的,它是Items.aspx頁面。 – Tarik 2010-04-07 16:42:00

+0

請解釋一下嗎?到底什麼是「什麼」? – 2010-04-07 16:43:21

+0

你能解釋一下頁面編譯嗎?我知道編譯後的代碼將在編譯期間被編譯。但是你說頁面會在第一次用戶請求時編譯,但是之後它會一直保持編譯狀態,或者其他用戶以後請求相同的頁面時,它會再次編譯嗎?編譯的副本永遠生活還是暫時的?謝謝。 – Tarik 2010-04-07 17:02:05

3

檢查您的web.config文件的命名空間部分,並確保System.Linq列在那裏。

文檔:
http://msdn.microsoft.com/en-us/library/ms164642.aspx

+0

這可避免在頁面級別執行此操作,但不會向OP解釋問題。 – 2010-04-07 16:44:34

+0

因此,對於源代碼中的覆蓋方法或其他命名空間成員(如spaghetti代碼),我必須聲明源代碼上的命名空間以及代碼隱藏? – Tarik 2010-04-07 16:44:52

+2

是的,有兩個獨立的編譯步驟。編譯後的代碼在您構建項目時編譯;首次訪問頁面時,或者當您使用「發佈...」或Web部署項目預編譯您的網站時,aspx會進行編譯。 – 2010-04-07 16:46:51

0

我不會標記使用First,如果你仍然想這樣做,使你的代碼的包裝背後,像SomeMethodSomeProperty和標記訪問它作爲<%=SomeProperty %>