命名空间问题

时间:2010-04-07 16:39:42

标签: c# asp.net namespaces

通常我们都会在代码隐藏中使用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 Source 部分添加相同的Linq名称空间

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

我是否知道错误或者这是asp.net中的某种错误。我认为在页面编译时,asp.net将这两个类组合在一起,并将html源代码转换为cs类,并在Control c= new Control();层次结构中指示控件。

提前致谢。

P.s:我试图在Items.aspx中找到例如First()以及我提到的关于asp.net页面的所有内容Items.aspx

4 个答案:

答案 0 :(得分:3)

检查web.config文件中是否有名称空间部分,并确保在那里列出了System.Linq。

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

答案 1 :(得分:3)

您必须在两个位置指定命名空间。这是正常的行为。在将它们合并到一个类并进行实际编译之前,编译器需要单独预编译aspx页面和代码隐藏页面。

默认情况下,aspx页面中已包含一些常用名称空间,因此您无需导入它们。但在您的情况下,您需要导入Linq。

编辑:正如Joel Coehoorn所说,你可以在Web.config中添加默认命名空间列表,如果你不想在aspx页面中手动添加它们。

答案 2 :(得分:0)

First不是类的方法,而是System.Linq命名空间中定义的扩展方法。即使你也可以在后面的代码中使用这个扩展方法,这并不意味着ASP.NET编译器可以在没有提示的情况下找到扩展方法 - 因此<%@ Imports ... %>指令。

请注意,ASP.NET编译(即aspx)与后面的代码编译是分开的。后者在构建项目时运行;您可以在第一次访问页面时运行,也可以使用“发布...”或Web部署项目预编译它。因此,如果在两个地方都使用它,每个编译器都需要被告知在哪里可以找到这个扩展方法。

答案 3 :(得分:0)

我不会在标记中使用First,如果您仍然想要这样做,请在您的代码中创建一个包装器,例如SomeMethodSomeProperty,并将其从标记访问{ {1}}