使用 MVVM 模式的 Asp .NET Web API

jtr*_*ron 1 asp.net asp.net-mvc mvvm asp.net-web-api

我试图了解我应该如何将 MVVM 模式用于 CRUD 操作。目前我的 API 控制器中有如下方法。我的问题是:使用 MVVM 模式,我还应该像那样构建我的 api(例如,访问 DB)吗?还是应该改变?如果没有任何变化,在这种情况下我将实现 ViewModels 以及它们应该如何由 API 管理?我做了一些研究,但对我来说仍然不清楚。

public IHttpActionResult GetProduct(int id)
{
    var product = _context.Products.SingleOrDefault(p => p.Id == id);
    return Ok(product);
}

[HttpPost]
public IHttpActionResult CreateProduct(Product product)
{
    ...
    _context.Products.Add(product);
    _context.SaveChanges();

    return Created(new Uri(Request.RequestUri + "/" + product.Id), product);
}
Run Code Online (Sandbox Code Playgroud)

小智 6

我认为部分问题在于您不了解 MVVM 在 Web 应用程序中的作用。要理解,您必须将 Web 应用程序视为由两个独立的应用程序组成——服务器端和客户端。

服务器端,使用的模式是MVC(并不奇怪,它被称为 ASP.NET MVC 是有原因的)。如果您试图围绕 MVC 模式来适应您对 MVVM 的理解——不要。它不适用。服务器端的MVC模式易于理解和实现;不要尝试将任何 MVVM 插入其中。只需使用服务器端模式设计您的服务器端代码。

客户端是另一回事。默认情况下,ASP.NET MVC 使用 Razor 页面在服务器上呈现您的 HTML,并将其传送给客户端以显示。而且,通常情况下,该 HTML 旨在通过回发到服务器来响应用户与页面的交互。您的控制器方法解释这些回发,执行所需的逻辑,并在响应中呈现正确的剃须刀页面。但这并不是编写网站的唯一方法。

人们越来越普遍地设计单页应用程序。这些使用 ajax 回调将用户操作的结果发送回服务器,然后处理响应。服务器端,这些请求几乎总是通过 WebApi 控制器方法处理,而不是 ASP.NET MVC 控制器方法。请求以 ajax 的形式通过网络,结果通常以 ajax 的形式返回。没有 HTML 被渲染。这就是 MVVM 发挥作用的地方。

在客户端,这些网页通常使用 javascript MVVM (ish) 框架,如Knockoutjsangular。响应 json 用于更新绑定到网页中的 HTML 元素的视图模型。这些框架处理 UI 和这些视图模型之间的同步更新和用户操作,就像绑定在 WPF 中同步 UI 和视图模型之间的更新一样。

简单来说,MVC就是它自己的东西,MVVM通常只存在于网站的客户端,而且通常只有在网站大量使用ajax回调而不是回发的时候。

而且,为了回答您的直接问题,如果您在客户端使用 MVVM,使用 ajax 调用来执行您的 CRUD 操作,您应该设计您的 WebApi 控制器方法来发布/获取/放置/删除您的数据。