通常我们都会在代码隐藏中使用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
答案 0 :(得分:3)
检查web.config文件中是否有名称空间部分,并确保在那里列出了System.Linq。
答案 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
,如果您仍然想要这样做,请在您的代码中创建一个包装器,例如SomeMethod
或SomeProperty
,并将其从标记访问{ {1}}