ASP.NET MVC 4 / MVVM / Web API 的良好结构? [关闭]
Posted
技术标签:
【中文标题】ASP.NET MVC 4 / MVVM / Web API 的良好结构? [关闭]【英文标题】:Good structure for ASP.NET MVC 4 / MVVM / Web API? [closed] 【发布时间】:2013-11-07 12:27:00 【问题描述】:我有一个 .NET MVC 4 项目并且刚刚启动了 Kendo UI MVVM 框架。 MVC 使用 ViewModel 将数据从控制器发送到视图。我通过 MVVM 框架管理所有客户端对象,并使用 JSON 序列化它们并将它们发送回我的控制器。
目前,我使用 MVC ViewModel 返回页面上的静态数据,并使用 jquery 调用来获取页面上所需的任何动态数据。我发现有两种检索数据的方法令人困惑。 (如果我觉得它令人困惑,想象下一个必须在我的代码中工作的开发人员)
我发现通过 ViewModels 将数据发送到视图有点没用,因为我可以轻松地拥有一个结构,在我的 javascript 代码中按需查询控制器(通过 Web API)并将其直接保存到我的 MVVM 视图模型中.
我发现在我的 UI 中使用 MVVM 框架有很多优势,它使控件绑定变得更加容易。
我的问题:
从控制器获取数据到 MVVM ViewModel 的最佳方式是什么?
我觉得使用 MVC ViewModel 是重复工作,因为我可以通过 ajax 请求查询我的 Web API,而不是将我的 MVC ViewModel 转换为我的 MVVM JS ViewModel。
永远不要将 MVC 视图模型返回到我的 UI 并始终使用客户端 Web API 调用来检索所有数据,这会是一种好方法吗?
谢谢,
尼古拉斯
【问题讨论】:
【参考方案1】:永远不要将 MVC 视图模型返回到我的 UI 是否是一种好方法 并始终使用客户端 Web API 调用来检索所有数据?
我会说这取决于您的用例。
您当然可以在页面显示在 MVC 模型中时返回需要呈现的数据。请记住,MVC 模型被渲染到服务器上生成的 html 页面中。这意味着这些值可以在返回给客户端之前直接注入 HTML。
另外请记住,如果您必须多次访问服务器,则完全呈现您的页面可能需要更长的时间;一次用于获取 HTML,然后一次用于每个 Kendo 小部件以异步获取数据。
也就是说,我通常最终会按照你说的做......只需渲染一个没有模型的 MVC 视图,然后让 Kendo UI 小部件在页面加载后获取它们的数据。
但实际上,这在某种程度上取决于您的数据。如果您的 MVC 模型包含:
public string Title get; set;
在 Razor 中你有:
<h1>@Title</h1>
那么这并不是我想要异步重新获取数据的情况。在这些情况下,我通常会做一些 hacky 的事情,然后将值放入页面中:
<script type="text/javascript">
window.viewData = window.viewData || ;
window.viewData.Title = "@Title"
</script>
<h1 data-bind="text: Title"></h1>
<script src="viewmodel.js"></script>
然后在 viewmodel.js 文件中(我从返回的 HTML 中创建了一个单独的文件,以便它可以被浏览器缓存)
(function (viewData)
var viewModel = kendo.observable(
Title: viewData.Title
);
kendo.bind($("body"), viewModel);
)(window.viewData);
不过,这只是我自己的方法。它不一定适用于所有情况。这一切都取决于您从哪里提取什么数据以及提取多少。
【讨论】:
太好了,你刚刚证实了我所做的很多假设。我认为此时我返回的数据不足以看到在返回 html 之前加载所有内容与在页面加载时获取之间存在巨大的性能差异。至于将 MVC 模型映射到 JS ViewModel 的“hacky”技术,我已经在做类似的事情了;不是最干净的,但它确实有效。我没有想过为 ViewModel 制作一个单独的文件,以便浏览器缓存它。好主意。感谢您的详细解答!【参考方案2】:从我对MVC架构的理解来看,MVVM中的View Model和MVC中的ViewModel是完全不同的。我从您的帖子中可以看出,您正在使用一个框架,借助该框架将数据绑定到视图。您能否详细说明框架或向我们提供代码,以便它可以帮助其他人/我更好地解决您的问题。
【讨论】:
你说得对,MVVM 中的 View Model 和 MVC 中的 ViewModel 完全不同。我正在使用docs.kendoui.com/getting-started/framework/mvvm/overview,它允许我创建可观察的 JS 对象,然后我可以绑定到我的 UI 控件,以便在我的 JS ViewModel 中跟踪任何更改。 我需要知道的是:将数据从控制器获取到 MVVM ViewModel 的最佳方式是什么。我觉得使用 MVC ViewModel 是重复工作,因为我可以通过 ajax 请求查询我的 Web API,而不是将我的 MVC ViewModel 转换为我的 MVVM JS ViewModel。 我希望 CodingWithSpike 的回答(下)有所帮助。以上是关于ASP.NET MVC 4 / MVVM / Web API 的良好结构? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章