【发布时间】:2012-07-22 00:20:22
【问题描述】:
Another user 建议Knockout MVC 处理一些 AJAX 发布问题。我读了一点,发现它是Knockout JS 的包装。所以我想知道两者之间的真正区别是什么?我应该打扰Knockout JS,因为Knockout MVC 存在吗?我什么时候会使用其中一个?
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-3 knockout.js knockout-2.0 knockout-mvc
Another user 建议Knockout MVC 处理一些 AJAX 发布问题。我读了一点,发现它是Knockout JS 的包装。所以我想知道两者之间的真正区别是什么?我应该打扰Knockout JS,因为Knockout MVC 存在吗?我什么时候会使用其中一个?
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-3 knockout.js knockout-2.0 knockout-mvc
Knockout MVC 是 WebForms 的混蛋。它通过控制器操作路由所有视图模型方法,这意味着发生的所有事情都必须反弹到服务器并返回。我不明白为什么有人会采用类似于 Knockout 的框架,它旨在成为 CLIENT SIDE MVVM,并强制它为每个功能调用服务器。
此外,在服务器上执行这些方法意味着对于每个函数调用,整个视图模型都需要传递给服务器,然后返回给客户端。 这太浪费了。
使用 Knockout MVC 意味着为了不必编写 javascript 而牺牲客户端代码的所有性能优势。 WebForms 做出了同样的权衡。这不是一个好的。这是一种反模式。
如果 Knockout MVC 明天死掉,网络将是一个更好的地方。
【讨论】:
我刚刚遇到了这个问题,它有一些非常消极的回答。我将迅速增加我的两美分的价值。
我才刚刚开始使用 KnockoutJS。由于我正在构建 ASP.NET MVC 应用程序,因此使用 Knockout MVC 之类的东西对我来说似乎是合乎逻辑的。在大多数情况下,这似乎是个好主意。我不想花时间在我的页面上编写 javascript 和 <!-- ko --> cmets,如果我可以使用我熟悉和喜爱的 .Net 功能来做同样的事情的话。
话虽如此...是的,目前 KMVC 存在一些限制。将整个模型发送回服务器是一件大事。所以我所做的是开始了我自己的knockout-mvc 分支。目前,这些变化必然是仓促的。但我现在有能力:
我希望尽快回来并真正清理我所做的事情。希望作者将这些更改包含在他的代码中。如果没有,我想我会继续使用自己的叉子。无论哪种方式,隧道尽头都有光。 KMVC 可能需要按现状进行改进,但我相信这个概念绝对值得去做。
我绝对认为
如果 Knockout MVC 明天死掉,网络将是一个更好的地方。
有点苛刻。
编辑:
我在查看 cmets 并再次查看原始问题是什么。完成后,我认为应该在我的答案中添加更多内容:
首先,最初的问题是 我是否有理由使用 Knockout MVC 而不是 Knockout JS? 回答/澄清(也许我只是挑剔):Knockout MVC 是一个框架旨在让您更轻松地将 KnockoutJS 与您的 ASP.NET MVC 应用程序集成。它主要通过使用熟悉的强类型构造来生成 KnockoutJS 标记来完成此操作。它不是 KnockoutJS 的替代品。一定要使用 KnockoutJS。问题实际上是是否也使用 Knockout MVC。
话虽如此,作为开发人员,您仍然可以选择何时使用所有可用工具的各个方面。如果您想通过向服务器执行完整请求来处理功能的某个方面,请执行此操作。如果您想执行 ajax 请求来检索/更新数据,请执行此操作。如果您想纯粹在客户端执行功能,请执行此操作。
使用 Knockout MVC 不会阻止您充分利用 KnockoutJS。使用 Knockout MVC 不会阻止您编写额外的 javascript 来处理您想要的尽可能多的客户端功能。仅仅因为 Knockout MVC 为您提供了一种快捷方式来生成服务器的 ajax 回调并不意味着您必须使用它们。不过,如果您的应用程序曾经持久化数据,那么它将不得不在某个时候打电话回家。
与仅使用 Apache 提供静态 HTML 和脚本文件相比,使用 ASP.NET MVC 构建应用程序后端是有原因的。 Knockout MVC 允许您继续利用这些相同的优势来协助 KnockoutJS 集成。
【讨论】:
I don't want to be spending time writing javascript既是KMVC存在的原因,也是它最大的缺陷。当您尝试避免使用 javascript 时,您正在与网络作斗争。
computed observable 在 KMVC 中所做的那样,性能优势已经丧失。 Knockout 会在客户端完成,KMVC 需要服务器请求。没有办法绕过它:KMVC 用性能和响应能力换取不写 javascript。
我觉得 Tyrsius 的回答有点过于否定。 Knockout MVC 仍处于早期开发阶段,但据我所知,它具有一些优势,并且比 Webforms 的服务器负担更轻。可见性依赖完全在客户端获得句柄,只有在使用函数时才会调用服务器。在处理复杂的数据结构时,有时无论如何都需要通过服务器,因此 Knockout MVC 可能是节省自己编写大量 Ajax 处理的好方法。
确实,它总是来回发送整个模型,这会产生一些开销,而不是自己构建它。但我不会完全注销它。尤其是当它在未来为复杂的验证得到适当的客户端处理时。
【讨论】:
在搜索了一些关于淘汰赛 mvc 的信息后,我发现了这篇文章。虽然我同意浪费网络带宽,但我还是被那行代码迷住了:
@{
var ko = Html.CreateKnockoutContext();
}
这是生成淘汰视图模型的一种简洁明了的方法。有没有人使用淘汰赛 MVC 只是为了该功能而不将所有逻辑移动到服务器端?
【讨论】:
var myViewModel = ko.mapping.fromJS([Return MVC model as JSON]);。无需 AJAX 即可工作。
Knockout.js 的美妙之处在于,您可以通过简单地从服务器来回传递 JSON 来为您的应用程序提供服务,而无需推送整个视图,服务器必须将整个视图分块以生成 HTML。
再次将其放回服务器似乎非常违反直觉!如果您对此感兴趣,最好首先使用剃刀语法来完成绑定。
我的建议是使用 knockout.js 进行绑定,以便在客户端而不是服务器上进行绑定(如果这是您的目标)。如果您希望您的视图在服务器上绑定数据,请使用 razor。
【讨论】:
此外,knockout.js 确实非常擅长客户端数据显示/删除/插入/更新,以及客户端数据计算。如果一个真正的业务逻辑这么简单,我们必须直接应用knockout.js。
事实上,业务逻辑并不总是那么简单。例如,当客户端在视图中插入一条新记录时,系统可能需要检查用户的身份验证,根据某些业务逻辑或公式为新创建的对象设置默认值等......所有这些,无论如何都应该去服务器端检查基于数据库数据的逻辑。
开发人员能够将所有必需的业务逻辑转换为 knockout.js 视图模型中的 java 脚本方法。但是这样的设计违反了集中处理业务逻辑的规则。
维护将成为这种设计的噩梦。
总结,什么框架选择真正取决于业务需求。有时,性能并不是首要考虑因素。
【讨论】:
我还可以看到很多使用 Knockout MVC 库的好用例。我几乎无法将 KnockoutJS 集成到我们的 MVC Web 应用程序中,正是因为 @ChinaHelloWorld 指出的原因。以下是一些我觉得它非常有用的案例。
我喜欢漂亮的强类型 HTML 辅助方法,在设置 KnockoutJS 时它变得完全无用和混乱。我能做的最好的事情是用辅助方法的额外参数手动附加我的绑定属性,但我不得不再次使用魔术字符串。我喜欢 Knockout MVC 提供的帮助程序,用于创建具有强类型、基于 C# 表达式的绑定的输入和其他元素。不过,这里我要提一下,我错过了生成字段的名称属性,所以我需要稍微调整一下。
使用纯字符串绑定时,总是很可能出现拼写错误,或者不完全了解要应用的绑定的正确格式。借助 Knockout MVC 的流畅 API 和 VS IntelliSense,应用正确的绑定真的很容易。
只需应用小的 [Computed] 属性,Knockout MVC 就可以以正确的 KnockoutJS 语法生成相应的绑定表达式。我认为这个也非常有用。
以经典方式,我需要在 C# 代码中拥有 viewmodel 类,然后(几乎)在 JS 中拥有相同的 viewmodel 代码(带有 observables)。好吧,这让我很沮丧,当我看到 Knockout MVC 中使用的技术时,我感到非常高兴。但是,我需要对其进行一些调整,以便能够将它与真正复杂的视图模型(嵌套视图模型、集合等)一起使用,并能够使用例如任何需要的自定义 JS 方法或计算的 observable 扩展映射的 Knockout 视图模型.
所以这里至少有四个非常好的点。关于视图模型往返:没有人告诉我们任何人都需要使用 Knockout MVC 的服务器端处理机制。我也不会使用它,只有当确实需要在服务器上处理一些复杂的业务逻辑时。但在大多数情况下,Knockout MVC 只是为了简化 MVC Views 和 KnockoutJS 的绑定和设置过程。所以我不太理解上面的不好的意见。我认为写这些意见的人并没有花精力去学习至少 Knockout MVC 的基本概念。你明确不应该使用 Knockout MVC 代替 KnockoutJS,而应该使用 KnockoutJS。在任何情况下,理解 Javascript 和至少 KnockoutJS 的基础知识仍然是强制性的。
我希望作者继续开发 Knockout MVC,因为除了这些优点之外,还有一些功能和改进确实会让它变得更加强大。
【讨论】:
在.Net MVC模式中,视图模型已经清楚地标记到每个视图/部分视图中,带有标签“@model yourmodel”,可以指导开发人员了解该视图将做什么。
使用 knockout.js MVVM 模式时,您可能不会看到任何 .Net 视图模型,除了视图中的“data-bind”等标签。这将使视图和控制器解耦,并且难以专门为团队中的新开发人员跟踪逻辑。
我相信knockoutMVC可以解决这些困难,节省大量的javascript代码,使系统难以维护和理解。
由于knockoutMVC使得设计仍然坚持应用服务器端视图模型,因为它是C#代码,因此易于跟踪和维护。
对于一个商业项目,经理应该始终专注于易于开发、易于维护、易于升级、易于理解和快速交付以赚钱。
牺牲一点性能但让它变得简单,客户端和服务器端的一致性应该是一个关键点。 Javascript 是一个很大的维护问题。
将整个视图模型发送回服务器端真的很重要吗?如果是这样,我们可以将一个大模型拆分为几个小模型。
【讨论】:
如果你不使用 komvc 生成的函数,你仍然有性能。正如 Nigel 所说,初始页面生成仍然必须由服务器生成。您始终可以在客户端添加用户脚本并创建不需要返回服务器的功能。它是一种工具,可以为开发人员提供一点生产力。与 Web 表单在性能上的比较肯定被夸大了。伙计们,这是一个可以帮助您按时完成任务的工具。
【讨论】:
我将增加我的 2 美分来支持 knockoutjs,尽管与淘汰赛 MVC 相比编写起来有点复杂,但在可重用性方面你获得的好处是巨大的。客户端代码也可以与其他技术和谐地工作。
撇开安全角度不谈,我个人认为淘汰 js 是使 asp.net MVC 复杂化的一种方式,它应该按原样(淘汰 js)与纯 RESTful 应用程序(如 asp.net webapi)一起使用。
【讨论】:
Knockout MVC 是 ASP .NET MVC 的一个强大扩展,它允许您使用开发人员友好的 fluentAPI 直接在您的 .NET 项目上实现网站客户端功能,无需 Javascript 并删除大量重复和重复的代码。
淘汰 MVC 与编写 ASP .NET MVC 剃须刀相同,您可以轻松获得客户端功能。
您不必编写视图模型和绑定代码行。
我一直在我的大多数网站上使用 koMVC,开发时间减少、易于维护和最小的学习曲线是一个巨大的回报。
我建议您查看他们的网站并尝试一些现场示例。 http://knockoutmvc.com
很快你就会爱上它。
【讨论】:
MVC 是一种架构模式,分为模型、视图和控制器三个组件。
KnockoutJS 最适合 MVC 架构,因为框架的数据绑定需要使用控制器。诸如 AngularJS 之类的框架更侧重于前端,因此它们与 MVVM 架构模式(模型、视图、视图模型)配合得更好。它们的数据绑定功能也不需要使用控制器,这减少了绑定范围。
【讨论】: