【问题标题】:Namespace Problem命名空间问题
【发布时间】:2026-01-31 10:15:01
【问题描述】:

通常我们都会在代码隐藏中使用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() 以及我提到的关于 Items.aspx 的 asp.net 页面的所有内容

【问题讨论】:

  • 你的意思是First()是在这个页面后面的Items类上定义的方法吗?
  • 我的意思是它是 System.Linq 的扩展方法,但我无法访问它,因为我还必须在源 html 上声明它才能查看成员。在代码隐藏中导入它似乎不适用于源代码部分。
  • 正确。它们是分开编译的。请参阅下面的评论。
  • 我已经编辑了我的答案,将所有内容放在一个位置。

标签: c# asp.net namespaces


【解决方案1】:

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

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

【讨论】:

  • 请解释一下?那么“某物”究竟是什么?
  • 你能解释一下页面编译吗?我知道代码隐藏将在编译期间编译。但是您说页面将在第一个用户请求时编译,但之后它将始终保持编译状态,或者当其他用户稍后请求同一页面时,它会再次编译吗?编译后的副本永远存在还是暂时的?谢谢。
  • 这是 aspnet_compiler 上的 MSDN 页面:msdn.microsoft.com/en-us/library/ms229863%28VS.80%29.aspx。它们不会在每次请求时都重新编译,不会。
【解决方案2】:

检查您的 web.config 文件中的命名空间部分,并确保其中列出了 System.Linq。

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

【讨论】:

  • 这避免了必须在页面级别执行此操作,但不会向 OP 解释问题。
  • 那么对于源代码上的reach方法或其他命名空间成员,如意大利面条代码,我必须在源代码上声明命名空间以及代码隐藏?
  • 是的,涉及两个单独的编译步骤。构建项目时编译背后的代码; aspx 在第一次访问页面时编译,或者当您使用“发布...”或 Web 部署项目预编译您的网站时。
【解决方案3】:

您必须在这两个地方指定名称空间。这是正常的行为。编译器需要这样才能分别预编译 aspx 页面和代码隐藏页面,然后将它们合并到一个类中并进行实际编译。

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

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

【讨论】:

    【解决方案4】:

    我不会在标记中使用First,如果您仍然想这样做,请在您的代码中创建一个包装器,例如SomeMethodSomeProperty,然后从标记中以&lt;%=SomeProperty %&gt; 访问它

    【讨论】: