在ASP.NET MVC视图中使用代码隐藏是否被视为不好的做法?今天和我的同事们就这个问题进行了一些辩论,我想知道社区的想法。
显然,当使用像Rails这样的另一个MVC时,这不是一个选项,这让我觉得它更依赖于那些习惯使用传统ASP.NET Web Forms应用程序的人。
答案 0 :(得分:11)
我想说在ASP.NET MVC中使用代码隐藏是一种不好的做法。 MVC允许分离关注点,其中表示逻辑(在视图中)与应用程序逻辑(在控制器中)分离。使用代码隐藏将在代码隐藏中混合表示逻辑和应用程序逻辑,从而破坏了MVC的一些好处。
答案 1 :(得分:8)
当然,ASP.NET MVC In Action的作者建议反对它,我同意。没有必要,为什么呢?在早期的测试版中,包含了代码隐藏文件,但是在RTM(或之前不久)删除了该文件。
通常情况下,它只是鼓励您在视图中执行比视图更多的非视图工作,因为它不在视线范围内。
答案 2 :(得分:6)
我在我的第一个ASP.NET MVC(预览3!)项目中广泛使用了代码隐藏 - 主要用于将强调类型的数据对象转换为强制类型的数据对象,将视图数据收集到IEnumerables中,这样我就可以横跨它,这种事情。
随着强类型视图的引入,以及(恐怖命名的)Model-View-ViewModel模式的实用化,我完全没有错过代码隐藏,因为它刚刚从项目框架中删除最终版本。
我现在强烈地感觉到,无论您在视图中执行任何处理代码,您都可以在ViewModel中对该处理的结果进行建模,并允许控制器执行实际操作处理,并使视图尽可能简单轻便。这将让你测试处理逻辑,它使视图更容易修改,并创建 - 我认为 - 在转换数据以进行显示和实际显示之间更加优雅。
答案 3 :(得分:5)
是的,代码隐藏一直是业务逻辑的秘密藏身之处,我们都知道它不应该处于View级别。
已删除代码隐藏以阻止顽皮的开发人员受到诱惑。
答案 4 :(得分:2)
我建议不惜一切代价避免MVC应用程序中的代码隐藏。使用后面的代码否定了使用MVC框架获得的一些值,例如关注点分离等。您希望在模型中应用数据访问,业务规则,类型转换和类型转换。如果您发现需要转换Dylan提到的数据类型,则可能需要创建ViewModel。 ViewModel基本上是您希望以您希望显示的格式显示的实际模型中的数据。
答案 5 :(得分:2)
使用MVC时,最好避免在代码中添加任何内容 我有兴趣听到哪个部分正在讨论,进入代码隐藏?
如果您是Asp.Net MVC的新手,我真的建议您花一些时间浏览Nerd晚餐示例。这里有免费的电子书和资源http://nerddinner.codeplex.com/。
从头开始创建简单的演示是一种很好的学习方法 在这样做之后,它可能会对你在代码隐藏中所拥有的代码的位置有所了解,也可以去。
注意: 如果您按照电子书阅读,请从codeplex获取最新的site.css
文件,否则虚拟地球地图将无法正确对齐。
HTH
拉尔夫
答案 6 :(得分:0)
应该注意,“Code Behind”是Web窗体视图引擎的一个功能。它实际上与ASP.NET MVC本身无关。
例如,MVC3中的Razor视图引擎甚至不支持它。
我会以这种方式回答你的问题:如果你不能在不重写控制器(甚至你的模型)的情况下切换视图引擎,那么你就没有正确使用MVC模式。
在模型(或视图模型)传递给视图之前,您在.aspx.cs文件中执行的大多数操作可能都应该完成。也就是说,在我从ASP.NET Web Forms迁移到ASP.NET MVC的项目中,我留下了很多Code Behind。例如,我发现使用Repeater控件比尝试在Web窗体中使用'for'循环更干净,更愉快。毕竟我仍在迭代View Model数据。那为什么不呢?保留关注点(实际上可能在更大程度上)。
我的意思是,为什么Web表单的“最佳实践”突然成为Web表单视图的错误方式?举个简单的例子,考虑一个Repeater,它为表的每个第二行分配一个不同的CSS类。我的控制器(甚至我的模型)为什么要关心?试图将这种逻辑内联在Web窗体中很快就会变成标签汤和完整的意大利面条。现在想象一些更复杂的东西。
我已经离开Master页面,在后面的代码中构建菜单。同样,所有数据都来自View Model。我不明白为什么以这种方式使用GridView或其他控件也应该是一个问题。
我通常在Web窗体中禁用了ViewState,并在“Init”中进行了数据绑定。不过,经常会有一个我无法摆脱的小ViewState。我在“渲染”中放了一些代码,将其移到窗体后面(默认为之前)。当转移到MVC时,我有时会留下这些代码。所以,我有ASP.MVC站点确实使用Code Behind。我只是小心它是特定于视图的代码。
在新项目中,我通常发现在大多数页面上对Code Behind的需求较少。值得庆幸的是,像Razor这样的视图引擎已经使得混合代码和在线标记在写入,读取和维护方面的痛苦要小得多。