使用WebAPI或MVC在ASP.NET中返回JSON

我正在构build一个客户端脚本很重的ASP.NET MVC应用程序,它将使用JSON和jQuery来操作DOM。

我的理解是Web API控制器MVC控制器都可以返回JSON。

鉴于我的情况,我应该使用Web API控制器还是MVC控制器

Web API控制器可以在任何ASP.NET应用程序中创build和托pipe,而不仅仅是MVC应用程序。 因此,创buildWeb API的一个显而易见的原因是,如果您没有MVC前端(例如,贵公司/组织托pipe的经典,REST风格的Web服务)。

MVC控制器通常依赖于MVC框架,如果您查看默认模板以及社区和同行完成的大部分工作,您会注意到几乎所有的MVC控制器都是以View为基础实现的。

就我个人而言,当我打算使用View()进行响应时,我使用MVC控制器,并且将使用Web API来处理不依赖于特定视图的任何事物。

当然有警告,但是一般来说,如果你不需要MVC的模型绑定行为,你的服务是以数据为中心的,而操作是以数据为中心的(例如CRUD操作),那么你可能需要一个“Web API控制器而不是“模型 – 视图控制器”。 相反,如果您的操作是以视图为中心的(例如,向用户提供用户pipe理页面),或者您需要MVC的模型绑定来生成“ajax partials”(非常不可能),那么您将需要一个MVC控制器。

就个人而言,我使用Web API控制器来驱动基于JSON的RESTful客户端,我使用MVC控制器来处理基本的浏览器路由和交付SPA。

WebAPI是用来制作一个API的。 如果您希望某人能够使用XML,JSON等API来使用您的API,则可以创buildWeb API。

在你的情况下,你只需要在JSON中与客户端交谈。

即使你的网站主要是客户端脚本驱动,你仍然会使用ASP.NET MVC控制器吗? 而且,因为你可能已经在逻辑上根据实体划分了你的控制器,所以添加这些json服务方法是有意义的,而不是专门为web api创build另一个类。

所以对于你的特定情况(如果我理解正确),我会坚持与控制器。

答案可以归结为关注的分离,加快服务的创造,依靠传统而不是configuration。

控制者的主要职责是作为视图和你的模型之间的协调者,但是API的主要职责是处理数据。 在API的惯例中,使CRUD操作非常容易。 以下是CRUD操作和HTTP操作之间的映射

  • GET:阅读
  • POST:创build
  • PUT:更新
  • 删除:删除

因此,使用API​​,您不必创build单独的操作,并使用HTTP操作进行属性设置。

我唯一担心的是ApiController是基于站点而不是基于区域的。 一个站点只能有一个apicontroller子文件夹为您命名您的控制器方法。 有些情况下,您可能希望在不同的地方复制控制器名称:

domain.com/api/area1/controller1/

domain.com/api/area2/controller1/

我记得有一些自定义的代码设置可以做到这一点,但它默认情况下不起作用。

当我开发小型MVC应用程序时,我使用控制器来划分子系统中的应用程序部分。 所以我看看我的程序的子系统部分是什么。 假设我有用户function和SubSystemA,SubSystemB等,然后我把这些在单独的控制器。 所以UserController,SubSystemAController和SubSystemB控制器。 我不使用存储库,然后因为它是一个小系统,这是完美的契合。 在这些控制器中,我混合了同时返回View和Json数据的Actions。 因为控制器可以返回View和Json数据。 那么不需要WebApi。 我想什么已经说过,WebApi的主要原因是,你可以用它来做其他事情,然后Mvc。 我的目标是总是less用不多。 如果我会使用WebApi,它会增加另一种实现代码的方式,而不提供更多。 脚本库也是一样。 我使用jQuery,jQueryUI,jqGrid和select2。 不要过度工程,如果没有必要。

使用web.API的最好的理由是,当你确定你不需要像mvc那样返回视图。 Web.API的主要目的是发回数据。 发回一个视图是不同的,但是如果你为了这个目的而使用普通的html和JavaScript一样,那么web.API就是一个完美的select。

我同意肖恩·威尔逊的答案,但不知道为什么,因为我只是有点困惑,仍然试图理解以下(可能是不正确的)预感 –

  • 使用WebAPI控制器将JSON数据传递给客户端,以便客户端可以处理视图操作。 这个过程不需要一个视图,而只是一个响应,无论调用什么方法(即javascript请求),以便客户端可以处理任何客户端操作。
  • 使用MVC控制器,当你需要使用数据来操纵一个视图,或者在page_load之后(即不适用于SPA应用程序)。

你看,我只是不知道我在这里是不正确的,因为Shaun的答案的最后一行陈述“我使用MVC控制器来处理基本的浏览器路由和交付的SPA”,我感到困惑。 – 也许我不完全知道什么是一个宁静的客户端,当我认为它可能是以JSONforms接收响应的JavaScript方法。 这是Stackoverflow中最接近的post,作为我的问题的答案是远程相关的,所以我回答这个post,而不是可能重复的问题。

在这种情况下,我会推荐WebApi,因为它是基于Javascript请求传输数据的完美select。 我通常会开发我的WebApi控制器,以便他们返回一个JSON友好的对象,然后可以通过我的Javascript轻松parsing。

如果您想要生成一些HTML并用Javascript调用replace页面的段,那么您唯一想要在MVC控制器上使用此操作的实际时间就是这种情况。

例如:

您有一个JQuery UI Datepicker,它可以根据select生成一个单选button列表,表示选定date的事件。

在这种情况下,您可以使用WebApi来返回一些JSON,然后使用Javascript来生成必要的HTML,但通常使用Javascript来创build大量的HTML是不好的做法。 让C#build立HTML然后通过局部视图返回它会更好,因为这样你不太可能遇到Javascriptparsing的错误。 更不用说它使得HTML更容易编写。