WebForms 是一个很棒的框架,但它确实需要您深入了解它。是的,您仍然应该是 HTML 和 JavaScript 方面的专家。我所听到的关于 WebForms 的每一个抱怨都来自那些没有花时间去理解 WebForms 的人。以下是我对其中一些的回答。
ViewState 是邪恶的,会减慢页面速度
这让我想起了将所有东西都设为全局变量的程序员。你当然可以这样做,但你不应该! WebForms 和 ViewState 也是如此。除非需要,否则不要使用 ViewState,而且要谨慎使用。将 1000 个字符的视图状态添加到 html 并没有错,如果它会带来更好的用户体验和/或加快开发时间。您可以在 MVC 中通过使用数百个隐藏的输入控件乱扔页面来遇到相同的问题,是的,我已经看到了。顺便说一句,ViewState 并不“神奇”,它只是将一些数据存储在单个输入控件中,并对其进行加密以达到良好的效果。
WebForms 生成“丑陋”的 html 并且到处都是长 ID
嗯,首先,实际上没有人会查看生成的 hmtl(例如,您是否查看过 google.com,它是一团糟?!)。其次,如果您真的关心生成特定的 html,只需不到一个小时就可以使用您选择的 html 创建您自己的可重用组件或控件。或者,您可以采用现有控制,覆盖渲染并改用该控制。再一次,你必须知道去哪里以及如何去做,但是一旦你知道了,这将是一个巨大的生产力提升,没有任何牺牲。自动生成长 ID 以确保整个页面的唯一性。如果您有机会开发复杂的 MVC 视图,您会注意到您将发明自己的长 id 模式,以便在发布时正确解析表单字段。
WebForms 不允许每页有多个表单
我已经开发了 10 年,只有一次我需要多个表单。然后我发现我没有。您确实必须了解 HTTP 请求和响应以及如何使用 WebForms 来实现它们,但如果您这样做了,您将永远不需要多个表单,也根本不会考虑“表单”。
WebForms 页面不可测试
绝对不是真的。即使您不喜欢 MVP(我不喜欢),也有其他技术可以测试您想要测试的任何内容。确实,如果您只是按原样使用 WebForms 中的页面并将所有逻辑隐藏在代码中,那么它可能无法测试,也不是一个好主意。但是,就像在 MVC 或 Windows 窗体应用程序中一样,您可以而且应该至少对于复杂的视图创建中间层,例如视图和控制器。我更喜欢将功能封装到实现接口或继承基类的用户控件中。然后用户控件所在的页面就像一个“主控制器”。在这种情况下,可以测试单个视图或用户控件,因为它们都实现了接口或基类。
JavaScript 很难在 WebForms 中实现
JavaScript 实际上在 WebForms 中比在 MVC 中更容易实现。你肯定有更多选择!但是再一次,您必须非常了解 WebForms 才能实现这一点。在 WebForms 中,您可以“注入”带有可重用组件和控件的 javacript。或者您可以在更改页面上的设置以保持 ASP 实现 id 命名方案后,像在 MVC 或纯 HTML 中一样使用它。
说了这么多,WebForms 有什么 MVC 没有的?在我看来,表示组件的封装和可重用性是迄今为止最大的。对于复杂的视图,我开发单独的组件(服务器或用户控件),然后自定义控制器或表示工厂将它们全部编织到位。此外,WebForms 中的设计时 html 比 MVC 中的要干净得多,这使得经过适当培训的图形设计师更容易进行设计和样式设计。它更干净,因为在设计时 html 中没有编程代码,只有标记(我不使用数据绑定表达式)。当然,在 WebForms 中进行原型设计要容易得多。对于原型,我通常会忽略所有最佳实践,而求助于向导和直接访问数据库的丑陋代码隐藏代码。
我可以继续说下去,但我想说的主要一点是,WebForms 和 MVC 是非常不同的模式,需要不同的知识和思维方式来提供出色的解决方案。两者都需要尽可能多的 Web/HTTP/CSS 知识。如果我必须对高流量的公共网站(例如博客)提出一项建议,但并非总是如此,我可能会倾向于 MVC。对于复杂的 Web 应用程序,无论是内部/Intranet 还是会员外部/Internet 应用程序,我都会倾向于 WebForms。