我正在构建一个客户端脚本繁重的 ASP.NET MVC 应用程序,它将使用 JSON 和 jQuery 来操作 DOM。
我的理解是Web API 控制器和MVC 控制器都可以返回 JSON。
鉴于我的情况,我应该使用Web API 控制器还是MVC 控制器?
我正在构建一个客户端脚本繁重的 ASP.NET MVC 应用程序,它将使用 JSON 和 jQuery 来操作 DOM。
我的理解是Web API 控制器和MVC 控制器都可以返回 JSON。
鉴于我的情况,我应该使用Web API 控制器还是MVC 控制器?
Web API 控制器可以在任何 ASP.NET 应用程序中创建和托管,而不仅仅是 MVC 应用程序。因此,创建 Web API 的一个明显原因是如果您没有 MVC 前端(例如,由您的公司/组织托管的经典 RESTful Web 服务。)
MVC 控制器通常依赖于 MVC 框架,如果您查看默认模板以及社区和您的同行所做的大部分工作,您会注意到几乎所有 MVC 控制器都是在考虑视图的情况下实现的。
就个人而言,当我打算使用 View() 进行响应时,我会使用 MVC 控制器,并且我将对不依赖于特定视图的任何事情使用 Web API。
当然,有一些警告,但一般来说,如果您不需要 MVC 的模型绑定行为,您的服务是以数据为中心的,并且操作是以数据为中心的(例如 CRUD 操作),那么您可能需要一个“Web API 控制器” ' 而不是“模型视图控制器”。相反,如果您的操作是以视图为中心的(例如,向用户提供用户管理页面),或者您需要 MVC 的模型绑定来生成“ajax 部分”(不太可能),那么您将需要一个 MVC 控制器。
就我个人而言,我使用 Web API 控制器来驱动基于 JSON 的 RESTful 客户端,我使用 MVC 控制器来处理基本的浏览器路由和 SPA 的交付。
WebAPI 用于制作 API。如果您希望某人能够以 XML、JSON 等格式使用您的 API。您可以制作一个 Web API。
在您的情况下,您只需要用 JSON 与客户交谈。
即使您的网站主要是客户端脚本驱动的,您仍然会使用 ASP.NET MVC 控制器,对吗?而且由于您可能已经根据实体在逻辑上划分了控制器,因此在其中添加这些 json 服务方法是有意义的,而不是专门为 web api 创建另一个类。
所以对于你的特殊情况(如果我理解正确的话),我会坚持使用控制器。
答案归结为关注点分离、加快服务的创建以及依赖约定而不是配置。
控制器的主要职责是充当视图和模型之间的协调者,但 API 的主要职责是处理数据。在 API 约定的情况下,执行 CRUD 操作非常容易。下面是 CRUD 操作和 HTTP 操作之间的映射
因此,使用 API,您不必创建单独的操作并使用 HTTP 操作对它们进行归因。
我对 ApiController 的唯一担忧是它是基于站点而不是基于区域的。一个站点只能有一个 apicontroller 子文件夹供您命名控制器方法。在某些情况下,您可能希望在不同区域复制控制器名称:
domain.com/api/area1/controller1/
domain.com/api/area2/controller1/
我记得有一些自定义代码设置可以做到这一点,但默认情况下它不起作用。
我同意肖恩威尔逊(最佳答案)的回答,但不知道为什么,因为我有点困惑,仍然试图理解以下(可能不正确)的预感 -
你看,我只是不知道我在这里有什么不正确并且感到困惑,因为肖恩回答的最后一行指出“我使用 MVC 控制器来处理基本的浏览器路由和 SPA 的交付。” - 当我假设它可能是接收 JSON 格式响应的 JavaScript 方法时,也许我不完全知道什么是安静的客户端。这是 Stackoverflow 中最接近的帖子,它与我的问题的答案远程相关,所以我正在回答这个帖子,而不是可能重复问题。
在这种情况下,我会推荐 WebApi,因为它非常适合基于 Javascript 请求传输此类数据。我通常会开发我的 WebApi 控制器,以便它们返回一个 JSON 友好的对象,然后我的 Javascript 可以轻松地对其进行解析。
如果您想生成一些 HTML 并用 Javascript 调用替换页面的各个部分,那么您唯一想要在 MVC 控制器上使用操作来完成此类事情的实时情况。
例如:
您有一个 JQuery UI Datepicker,它在选择时会生成一个单选按钮列表,这些单选按钮代表所选日期的事件。
在这种情况下,您可以使用 WebApi 返回一些 JSON,然后使用 Javascript 生成必要的 HTML,但通常使用 Javascript 创建大量 HTML 是不好的做法。让 C# 构建 HTML 然后通过部分视图返回它会更好,因为这样您就不太可能遇到 Javascript 解析错误。更不用说它使 HTML 更容易编写。