上周,我的老板要求我的团队为下一个项目评估ASP.NET MVC.我们所有人都使用自.NET 1.1以来的webform,我们以前没有MVC经验,但我的所有同事都对ASP.NET MVC感兴趣,但没有运气,我们的最终答案是否定的.
因为:
我们相信尽管您是ASP.NET Guru,但您可以在短时间内构建复杂的应用程序.但是如果你改为ASP.NET MVC,开发时间会花费更长的时间,每个东西都需要使用html helper,没有web控件,还有很多问题,请继续打开带有ASP.NET论坛的Firefox Tab,询问How-To问题.
我们曾经多次看到人们说MVC提供更好的项目管理,但如果它是一个复杂的网站,我可以想象在一个页面中有一百个<%=%> TAG,并保持打开控制器以查看返回的内容,并保持打开模型来看逻辑.
我可以说,MVC并不坏,但Webform足以应对这项工作.
转换为新技术或"思维方式"需要数周时间.
使用MVC,您必须摆脱旧的ASP.NET Forms思考"复杂Web应用程序"的方式,即"我们有多少页面,超过300页!这将是巨大的!".您可以更改整个应用程序的视图.你从"接下来需要创建的页面"的旧思维转向MVC思考"我们接下来需要实现什么功能"的思维方式.
例如,我自己控制了一个项目,该项目仅在'web'项目中有超过3300个文件(加上11个支持程序集).我正在构建的一件事是MVC将如何将物理文件的数量大幅减少到大约310左右.怎么样?因为我正在离开"这里是一页.这是另一页." 以"这是我想要实现的功能"的思维方式.
通过将页面视为您要完成的功能,您可以开始将该页面的部分抽象为常用功能.
MVC可以通过这种思维方式进行大规模扩展,因为现在你有一个模板用于你想要它的外观,你只需要实现另一个"函数"来改变你想要渲染的视图(html)的外观.没有第二页,没有额外的控制等.
现在,正如你所提到的"没有网络控制":再次,这需要一种不同的思维方式.HtmlHelper用于基本渲染和编码.我使用一个名为MyProjectHelper的抽象类来使用相同的概念,该类将我的"函数"呈现在页面上(functions = code).
例如,我总是在过去为我的DisplayNames创建一个服务器控件.这允许我控制DisplayName的显示方式,特别是切换到Facebook Connect和其他东西.使用MVC,我不再使用"服务器控件",而是使用ViewModel上的"函数"来呈现该文本:CollegeProjectViewModel.RenderDisplayName().因为这只是UI层的一部分,所以这将根据需要使用我想要的任何选项呈现Anchor(当然,摘要是由学习"基本"文本渲染的CollegeProjectViewModel继承的).
MVC的强大之处在于能够不再需要"网页",而是"功能"或您想要对您的网站做什么的方法.通过改变这种思维方式,您可以使用在控制器上创建的尽可能多的方法进行扩展.它确实加速了大规模的IMO.
我在我上一家公司工作了6个月的MVC项目(我们使用的是CTP版本,最后是beta版本).最初,这很有趣,令人兴奋,感觉我们真的很喜欢.像许多.NET开发人员一样,我们厌倦了Web Forms的漏洞抽象.
然而,随着时间的推移,我们开始质疑我们的决定.UI开发占用了我们80%以上的时间.我们必须从头开始构建所有UI.有一半时间感觉我们正在重新发明轮子.我们的大多数Rich UI都来自JQuery和Custom HTML Helpers,它们设计起来很有趣,但却很耗时.
我们遇到了其他问题,例如DTO类对象从我们的业务对象(从NHibernate支持的存储库获取)映射到Views的必要性.我们的控制器,显然应该是轻量级的,易于维护,变得越来越混乱,我们一直在争论实现控制器继承的正确方法.
回想起来,我觉得我们遇到的所有问题都是由于我们缺乏对MVC的经验和理解.我们都喜欢MVC的想法,但只是没有实际经验和专业知识来有效地使用它我认为是一个非常复杂的(想象一下销售队伍,但有更好的报告)应用程序.
- 更新 -
上个月一直在使用它来处理一个非常小的项目,到目前为止事情进展顺利.使用它比我一年前使用的CTP版本容易得多.我目前正在寻找我自己的复杂"网格视图"的个人解决方案,然后我可能完全切换到大多数项目.然而,动态数据一直在对待我,我在两者之间徘徊.
- 2011年更新 -
在过去一年左右的几个不同规模的MVC项目之后,我已经成为一个转换.我使用它的所有实际问题大多已在最新版本(2和3)中得到解决,特别是涉及模型验证和视图绑定的版本.
但有一件事:创建高度交互的数据网格仍然有点乏味,这在WebForm中仍然有些容易.但是,有第三方提供提供有用的MVC扩展,使这不那么令人担忧.就个人而言,我使用Telerik的产品来达到目的.