2010-04-07 141 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 %>