从传统的ASP.NET MVC转向WebApi + Knockout

6
我刚读了一篇有趣的文章,介绍了微软似乎正在向面向 REST 接口和基于客户端 JavaScript 的 MVVM 开发模式转变,用于 Web 应用程序。
虽然我在技术上理解这两种模型的基本区别,但我对它对我编写 Web 应用程序以及如何平稳过渡到这个新模型的影响感到非常困惑。
因此,对于从传统的 ASP.NET MVC 转向 WebApi + KO 的人来说,以下问题会出现:
  • 是否有一种使用 MVC + KO 实现无侵入或近乎无侵入(即最少代码)验证的方法?
  • 如何对 UI 代码进行单元测试?
  • KO 是否存在浏览器兼容性问题?
  • 当从一种模型转换到另一种模型时,还有其他要考虑的事项吗?

现在我有点困惑:.NET MVC和WebAPI不是有不同的用途吗?我的意思是,MVC是用于Web应用程序和站点,而WebAPI则用于API(以及服务等)。那么,为什么有人要从MVC迁移到API呢?我错过了什么吗? - Andre Calil
这并不一定是真的。这只是一种不同的做事方式。你可以拥有一个Web API,它可以被任何客户端使用 - 包括但不限于你自己的网站! - georgiosd
1
@AndreCalil 没有理由不使用WebApi来创建网站。HTML只是另一种媒体类型。 - Darrel Miller
关于使用Web API还是标准MVC控制器的问题,这个问题(以及我的看法)可能会有所帮助:http://stackoverflow.com/questions/9776126/should-i-be-using-my-own-web-api/11183838#11183838 - Tom W Hall
1
在浏览器兼容性方面,我最近遇到的唯一问题是这个:http://stackoverflow.com/questions/11442919/binding-error-in-knockout-js-in-ie9-compatibility-view - 我希望有人可以在这个问题上给予指导。除此之外,我发现 Knockout 是可预测的、强大的,总体来说非常棒。 - Tom W Hall
显示剩余2条评论
2个回答

5
你会看到微软开始推动这个“单页Web应用”概念,部分原因是它可以提供更好的用户体验,但主要是因为它使得将Web应用迁移到成为Windows 8本地应用程序变得更加容易。
关于无侵入式JavaScript验证...我想说,如果你正在使用Knockout,即使只是基础功能,你的UI和脚本也会非常紧密地耦合在一起,所以无侵入性不是一个有效的目标。你可以在Knockout中进行验证(例如,请参阅https://github.com/ericmbarnard/Knockout-Validation#readme),但按照ASP.NET MVC的定义,它并不是无侵入式的。
关于单元测试...请看https://stackoverflow.com/questions/6331789/knockoutjs-unit-testing-with-qunit 关于浏览器兼容性...除非你有禁用JavaScript的疯狂用户,否则我不知道任何现代浏览器存在兼容性问题。

5

我发现这篇文章非常好地讨论了尝试使用 Knockout 网站时“不显眼”的利弊。

传统上,我非常支持尽可能使 Javascript 不显眼,并且在我的 Knockout 表达式中,我尝试通过将任何繁重的工作转移到视图模型上的函数并创建自定义绑定来使它们尽可能简洁整洁,这些自定义绑定封装了 DOM 逻辑 - 但我坚信,当明智地使用时,声明性方法本身(例如使用 data-bind 属性的默认方法)是正确的方法。

也许是因为我对 Knockout 的介绍是我所工作的 WPF 应用程序的 Web 应用程序“移植”,随着我学习如何优雅地利用 Knockout,我的网站的 Knockout 绑定与其 XAML 等效项变得惊人接近。我喜欢能够查看标记,并一眼看到评估视图的实际业务逻辑,而不是 jQuery 或其他内容在响应某个单击事件时物理构建它的具体细节,这些细节会摧毁我的灵魂。

当我重新访问一些传统的 MVC 站点,这些站点利用大量的过程化 jQuery 来连接事物时,我想,是的,标记很整洁,但在6个月后回到它之后,即使我也难以理解我的意图是什么,所有这些 jQuery 选择器、回调和 DOM 遍历。如果我的绑定逻辑本身是动态的,我认为我只会动态地应用 Knockout 绑定本身 - 但是那可能可以通过动态模板以不同的方式实现。

这是我对您问题中“不显眼”方面的看法,如果您移动到 MVVM Javascript 的经验与我在过去几个月中的经验一样,您将不会回头。


非常好的答案,谢谢!您能详细说明一下您对KO最佳实践的了解吗? - georgiosd
我仅使用 Knockout 几个月,所以还不能对“最佳实践”做出太多宣称,但我肯定学到了很多,并且一直在不断地完善我的使用模式。我最近添加了很多关于 Knockout 的答案 / 问题 / 激励性的言论,这可能会对你有所帮助,否则请通过我的网站给我发电子邮件。干杯。 - Tom W Hall
@TomHall:很高兴听到你的经验!如果您能发布任何资源并提供有关如何使用这些技术(knockout.js + ASP.NET Web API)执行典型实体CRUD功能的示例,那将非常有帮助和棒极了!非常感谢。 - superjos

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