ASP.NET MVC项目和App_Code文件夹

13

为什么在VS解决方案资源管理器的“添加ASP.NET文件夹”子菜单中没有“App_Code”选项?我知道你可以通过重命名新文件夹来手动创建一个,但这样做的理由是什么?难道这不是放置“工具”或“服务层”类型类的地方吗?

另外提一下MVC项目,我喜欢它默认包含对System.Configuration的引用,而默认的ASP.NET Web表单项目则没有。

4个回答

21

这可能是因为ASP.NET MVC项目是一个Web应用程序而不是一个网站。在一个网站中,类文件在运行时动态编译,并且必须存放在App_Code文件夹中。在Web应用程序中,所有内容都被静态编译,类文件可以存放在Web应用程序的任何位置。

正如David Brown所指出的,通常建议将额外的类定义放在单独的类库中,然后从您的Web应用程序引用该类库。如果您编写单元测试或从配置文件引用您的类,如果它们仅在您的Web应用程序中定义,则访问这些类可能是具有挑战性或不可能的。


我也注意到了“转换为 Web 应用程序”,这是什么意思?为什么在 MVC 中会有这个选项? - BuddyJoe
具有讽刺意味的是,“转换为Web应用程序”仅适用于Web应用程序!此选项实际上是针对从网站转换而来的Web应用程序。它会遍历您的所有aspx和ascx文件,并将它们转换为Web应用程序格式。 - davogones
davogones,你对这个问题有什么想法吗:http://stackoverflow.com/questions/425015/asp-net-wcf-and-could-not-load-file-or-assembly-appwebhamznvwf 我一直忙于其他事情,还没有时间给微软打电话。 - BuddyJoe

10
真正的原因是微软希望你相信需要使用VS才能做MVC。但是,要将项目转换为纯JIT(即时编译),这样工作起来会更加容易...
你可以很直接地完成这个过程。
(1) 将所有包含类文件的文件夹移动到“App_Code”中(将“Views”文件夹保留在原地)
(2) 通过删除这些属性并放置代码,使Global.asax 不需要代码后台或继承引用
[script runat="server"] 
... place contents of code behind's class inner code 
[/script] 

并永久性地删除背后的代码

(3) 在Bin中,删除项目DLL引用,确保保留其他必要的DLL以便运行MVC
(4) 删除解决方案文件、属性文件夹和obj文件夹。

我经常对nop MVC执行此操作,因为使用JIT在Web层上更加简单。那些不理解这一点的开发人员不是每天在许多网站上紧急处理各种自定义快速修复。我们处理的网站每天会有成千上万的点击量,因此在初始增长后使用JIT不会影响性能。
似乎在小型网站开发中,少即是多。


1
顺便说一下,我已经停止使用MVC模式了。我只使用纯矩阵式和URL重写。这样可以减少大量的代码。好吧,反正现在我正在开始全部转向Linux。Node.js真的很牛逼。 - King Friday
还有一个好处是,您可以测试 [RequireHttps],而不必在代码中添加大量的垃圾语句。 - Damon Drake
这个解决方案就像黑夜中的恐怖,它以吞噬小孤儿的灵魂为乐。请不要将你糟糕的发布管理与这个答案联系在一起来进行辩解。 - John Zabroski
1
“发布管理” :) 这是指当你在一个大型项目的开发团队中工作时,而不是当你有1000个需要快速修复的小型电子商务客户,每个客户的要求略有不同。这会毁掉我的业务,但我理解你的情况。 - King Friday
我现在正在苦恼这个问题。在小应用程序上一切看起来都很好,但是当事情变得复杂时,使用VS来维护一切变得令人头痛。 - johnny
我很久以前就完全放弃了asp.net,转而使用node和go,但除此之外,对于大型应用程序,你应该按照它的设计方式使用VS,忽略这一点。我的使用情况是为小到中等客户提供快速修复。 - King Friday

10

通常情况下,我会把“服务层”和“工具”类置于一个独立的项目中,并将其作为参考添加到我的Web应用程序中。使用MVC框架,我不认为需要在运行时编译类。


开发速度方面怎么样?改变代码/保存/刷新浏览器与改变代码/保存/构建.../刷新浏览器。 - Brian White
David,你是把你的项目放在同一个解决方案中并引用它们,还是将它们完全分开成不同的项目并获取引用? - johnny
1
@johnny 在同一个解决方案中,除非它是我在其他地方重复使用的通用库。 - David Brown

0

对于那些不想要第二个项目/类库,只想要一个简单的文件夹来存放几个C#类的人,我建议使用“App_Classes”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接