使用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更容易编写。
- 如何在Microsoft.AspNet.Identity.EntityFramework.IdentityUser中更改id的types
- Razor视图与ASPX.Master页面可能吗?
- MVC 5阻止通过Iframe访问内容
- 基于angular色的访问控制(RBAC)与ASP.NET MVC中的基于声明的访问控制(CBAC)
- ASP.NET MVC:如何让浏览器打开并显示PDF,而不是显示下载提示?
- 从app_data中删除.mdf文件导致exception无法将文件附加为数据库
- 需要razor视图引擎自动完成在类库中工作?
- 如何从HttpPost创build操作方法中知道选中的checkbox?
- 在下拉列表中支持optgroup .NET MVC?