我一直在摆弄ASP。NET MVC 4 beta和我现在看到两种类型的控制器:ApiController和Controller。

我有点困惑在什么情况下我可以选择一个特定的控制器。

例如:如果我想返回一个视图,那么我必须使用ApiController或普通控制器?我知道WCF Web API现在已经与MVC集成了。

既然现在我们可以使用两个控制器有人能指出对应的控制器的情况吗。


当前回答

快速简短回答

如果你想返回一个视图,你应该在“Controller”中。

正常控制器- ASP。NET MVC:如果你在ASP.net Web应用程序中,你处理的是普通的“控制器”。你可以创建Controller-Actions并返回Views()。

ApiController Controller:在开发ASP.net REST api时创建ApiControllers。你不能返回视图(虽然你可以返回Json/Data为HTML字符串)。这些api被认为是后端,它们的函数被调用来返回数据而不是视图

详情请点击此处

其他回答

使用Controller来呈现正常的视图。ApiController动作只返回已序列化并发送给客户端的数据。

这是链接

引用:

如果您使用过ASP。NET MVC,那么你已经熟悉控制器了。它们在Web API中工作类似,但是Web API中的控制器派生于ApiController类而不是Controller类。您将注意到的第一个主要区别是Web API控制器上的操作不返回视图,而是返回数据。

ApiControllers专门用于返回数据。例如,它们负责将数据透明地序列化为客户端所请求的格式。此外,它们默认情况下遵循不同的路由方案(例如:将url映射到动作),根据约定提供REST-ful API。

你可能可以使用Controller而不是ApiController来做任何事情,并使用一些(?)手动编码。最后,这两个控制器都是建立在ASP。净的基础。但是拥有一个REST-ful API在今天是如此普遍的需求,以至于WebAPI被创建来简化这样一个API的实现。

两者之间的选择相当简单:如果你正在编写一个基于HTML的web/internet/intranet应用程序——可能偶尔会在这里或那里调用AJAX返回json——坚持使用MVC/Controller。如果你想为系统提供一个数据驱动/ rest接口,可以使用WebAPI。当然,您可以将两者结合起来,使用ApiController来满足来自MVC页面的AJAX调用。

举一个真实的例子:我目前正在使用一个ERP系统,该系统为其实体提供了一个REST-ful API。对于这个API, WebAPI将是一个很好的候选。同时,ERP系统提供了一个高度ajax化的web应用程序,您可以使用它为REST-ful API创建查询。web应用程序本身可以实现为MVC应用程序,利用WebAPI获取元数据等。

你更愿意编写和维护哪一个?

ASP。NET MVC

public class TweetsController : Controller {
  // GET: /Tweets/
  [HttpGet]
  public ActionResult Index() {
    return Json(Twitter.GetTweets(), JsonRequestBehavior.AllowGet);
  }
}

ASP。网上广告

public class TweetsController : ApiController {
  // GET: /Api/Tweets/
  public List<Tweet> Get() {
    return Twitter.GetTweets();
  }
}

Web API中的每个方法都将返回数据(JSON)而无需序列化。

然而,为了在MVC控制器中返回JSON数据,我们将返回的Action Result类型设置为JsonResult,并在我们的对象上调用JSON方法,以确保它被打包在JSON中。

主要的区别是:Web API是针对任何客户端、任何设备的服务,而MVC控制器只服务于它的客户端。同样,因为它是MVC平台。

快速简短回答

如果你想返回一个视图,你应该在“Controller”中。

正常控制器- ASP。NET MVC:如果你在ASP.net Web应用程序中,你处理的是普通的“控制器”。你可以创建Controller-Actions并返回Views()。

ApiController Controller:在开发ASP.net REST api时创建ApiControllers。你不能返回视图(虽然你可以返回Json/Data为HTML字符串)。这些api被认为是后端,它们的函数被调用来返回数据而不是视图

详情请点击此处