在ASP.NET MVC视图中使用代码后台是否被认为是一种不好的做法?今天我和同事们进行了一场辩论,想知道社区的想法。
显然,在使用类似Rails的另一个MVC时,这不是一个选项,这让我觉得它更多地被那些习惯于使用传统ASP.NET Web Forms应用程序的人所依赖。
在ASP.NET MVC视图中使用代码后台是否被认为是一种不好的做法?今天我和同事们进行了一场辩论,想知道社区的想法。
显然,在使用类似Rails的另一个MVC时,这不是一个选项,这让我觉得它更多地被那些习惯于使用传统ASP.NET Web Forms应用程序的人所依赖。
我认为在ASP.NET MVC中使用code-behinds是一种不好的做法。MVC允许将表现逻辑(在视图中)与应用逻辑(在控制器中)分开。使用code-behinds会将表现逻辑和应用逻辑混合到code-behinds中,从而破坏MVC的一些好处。
我在第一个ASP.NET MVC项目(Preview 3!)中广泛使用了代码后台——主要用于将ViewData [“ foo”]转换为强类型数据对象,将视图数据收集到可枚举对象中以便进行循环等操作。
随着强类型视图的引入和(可怕命名的)Model-View-ViewModel模式的实用化使用,自从在最终版本发布之前从项目框架中删除它以来,我一直没有想念过代码后台。
我现在坚信,无论您在视图的代码后台中执行哪些处理,都应该更好地将处理结果建模为您的ViewModel,允许控制器执行实际处理,并使视图尽可能简单轻量。这将让您测试处理逻辑,使视图更易于修改,并创建 - 我认为 - 在转换数据以供显示和实际显示之间形成更优雅的分离。
是的,Code behind(即代码后台)长期以来一直是业务逻辑的秘密藏身之处,我们都知道这些内容不应该出现在View层。
从中移除Code behind是为了防止开发人员受到诱惑而做出不当行为。
需要注意的是,“Code Behind”是Web Forms视图引擎的一个功能。它与ASP.NET MVC本身没有任何关系。
例如,在MVC3中,Razor视图引擎甚至不支持它。
我会这样回答你的问题:如果你无法在不重写控制器(甚至是模型)的情况下切换视图引擎,则没有正确使用MVC模式。
可能你在.aspx.cs文件中大部分的工作应该在模型(或视图模型)传递给视图之前完成。话虽如此,在我从ASP.NET Web Forms迁移到ASP.NET MVC的项目中,我保留了很多Code Behind。例如,我发现使用Repeater控件比在Web Forms中尝试使用“for”循环更清晰、更令人愉悦。毕竟,我只是对视图模型数据进行迭代。所以为什么不呢?关注点分离得到保留(实际上可能更好)。
我的意思是,为什么Web Forms的“最佳实践”突然成为Web Forms View的错误方式?以一个简单的例子来说,考虑一个Repeater,它为表格的每一行分配不同的CSS类。为什么我的控制器(甚至我的模型)要关心这个呢?试图在Web Forms中内联这种逻辑很快就会变成标记汤和完全的混乱。现在想象一些更复杂的东西。
我保留了Master页面,它在代码后台构建菜单。同样,所有数据都来自View Model。我不认为以这种方式使用GridView或其他控件会有问题。
我通常在Web Forms中禁用ViewState,并在“Init”中进行数据绑定。尽管如此,仍然会有一些小的ViewState无法摆脱。我在“Render”中放置了一些代码,将其移动到表单之后(默认情况下为之前)。当转移到MVC时,我有时会保留这段代码。因此,我确实使用了Code Behind的ASP.MVC站点。我只是小心,确保它是特定于视图的代码。
在新项目中,我通常发现大多数页面不需要Code Behind。值得庆幸的是,像Razor这样的视图引擎使得混合代码和标记变得更加容易编写、阅读和维护。