ASP.NET MVC:在 App_Code 中包含扩展方法的文件必须具有构建操作“无”吗?

Posted

技术标签:

【中文标题】ASP.NET MVC:在 App_Code 中包含扩展方法的文件必须具有构建操作“无”吗?【英文标题】:ASP.NET MVC: files containing extension methods inside App_Code must have Build Action "None"? 【发布时间】:2011-03-11 15:34:33 【问题描述】:

这似乎是唯一有效的方法:

如果 .cs 文件在 App_Code 中... 并且不包含扩展方法:将构建操作设置为“编译”;否则项目中没有其他源代码知道它的存在。 并包含扩展方法:将构建操作设置为“无”;否则你会得到一个错误,即对 x.Foo 的引用在 MyExtensions.FooMyExtensions.Foo 之间不明确。 如果 .cs 文件位于 App_Code 之外,位于名为 Helpers 的文件夹中,则无论其是否包含扩展方法,它都必须将构建操作设置为“编译”。

我不明白这种行为。我不确定 ASP.NET MVC 是否包含 App_Code 的任何特殊权限,但它看起来确实如此......但只是在它自动编译包含 .cs 文件的扩展方法的意义上,即使构建操作是设置为“无”??有人请解释一下。

【问题讨论】:

【参考方案1】:

我假设您创建了一个 Web 应用程序项目,而不是一个网站项目。 ASP.NET 应用程序中的 App_Code 文件夹是特殊的。它旨在允许您插入代码以将其与网站一起编译。因此,项目项被标记为“无”以确保它们不是由 Visual Studio 编译的。当您将网站项目发布到托管环境时,代码文件本身会复制到 App_Code 文件夹中,并由 ASP.NET 运行时编译成单独的程序集。

现在,当您创建 MVC Web 应用程序时,您必须记住它与网站项目的项目类型不同。 MVC Web 应用程序将在本地编译为 /bin 目录中的程序集。如果您将 App_Code 文件夹添加到包含您的代码的项目并将构建类型更改为编译,您会遇到问题,因为:

    您的 MVC 应用程序已编译并包含 MyExtensions.Foo 类型,并且, ASP.NET 正在编译 App_Code 文件夹,该文件夹也有一个 MyExtensions.Foo 类型。

我的建议是避免使用 App_Code。我倾向于不这样做,因为我喜欢更简洁的项目结构。使用 Models 文件夹存储代码,或创建其他文件夹.....

如果您真的想使用 App_Code 文件夹,最好将任何文件的构建操作标记为“内容”,以确保在发布您的网站时将它们复制到输出目录。

【讨论】:

这并不能真正解释为什么我必须为其他非扩展方法源文件将构建操作设置为“编译”。例如。我定义了一个在各种模型中使用的自定义属性,并将该属性的代码放在 App_Code 中,但是如果我将该属性的 .cs 文件的构建操作设置为“无”,那么我的项目将无法编译。

以上是关于ASP.NET MVC:在 App_Code 中包含扩展方法的文件必须具有构建操作“无”吗?的主要内容,如果未能解决你的问题,请参考以下文章

MVC 公共类App_Code不识别

asp.net MVC动态路由

在 ASP.NET MVC Html.ActionLink 中包含锚标记

如何在 ASP.Net MVC 剃须刀助手中指定图像的虚拟路径

ASP.NET 项目 App_Code下无法找到类

在 ASP.NET MVC Web 应用程序中包含预编译的视图