ASP.NET MVC:包含App_Code内部扩展方法的文件必须具有Build Action“None”?

时间:2010-07-04 15:23:26

标签: asp.net-mvc asp.net-mvc-2 extension-methods app-code

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

  1. 您的MVC应用程序已编译并包含MyExtensions.Foo类型和
  2. ASP.NET正在编译App_Code文件夹,该文件夹也有MyExtensions.Foo类型。
  3. 我的建议是避免使用App_Code。我倾向于不喜欢,因为我赞成更简洁的项目结构。使用Models文件夹代码,或创建其他文件夹.....

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