如何将 ApiControllers 用于您当前的 MVC 应用程序





5.00/5 (2投票s)
可能你像我一样,开始在你的 MVC 应用中集成 AngularJS 或任何其他 JS 框架,然后才发现你需要将很多结果转换为处理这些调用。虽然这在使用 MVC 控制器时有效,但你总是需要将结果序列化为 JSON 格式并启用
可能你像我一样,开始在你的 MVC 应用中集成 AngularJS 或任何其他 JS 框架,然后才发现你需要将很多结果转换为处理这些调用。虽然这在使用 MVC 控制器时有效,但你总是需要将结果序列化为 JSON 格式并启用客户端 GET 请求,例如这样。
那么如何避免这种情况呢?
通过使用 API Controllers。
那么这两者有什么区别呢?很简单,Controllers 返回一个 View,而 ApiController 返回序列化的数据给客户端。现在你明白为什么会使用它了吧?因为如果你使用任何抓取数据的 JavaScript 框架,那么 ApiControllers 就更有意义了,因为它就是为此设计的。它们专门用于返回数据,并负责透明地将数据序列化为客户端请求的格式。它们还提供 RESTful API,因为它们默认遵循不同的路由方案。虽然控制器也可以做到这一点,但你必须进行大量的手动编码才能实现。
现在,如果我当前已经有一个 MVC 应用,该如何添加它呢?如果你是从头开始,可以选择 Web API 项目,如下所示
但是,如果你的项目已经在运行,请按照以下步骤操作。
- 添加对 System.Web.Http.WebHost 的引用。
- 在 App_Start 文件夹中创建一个名为 WebApiConfig.cs 的新类
然后像这样注册你的路由public static class WebApiConfig { public static void Register(HttpConfiguration configuration) { configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); configuration.Routes.MapHttpRoute( "DefaultApi", "api/{controller}/{id}", new { id = RouteParameter.Optional } ); } }
- 修改 Global.asax.cs 以首先注册 WebApiConfiguration,方法是添加对 System.Web.Http 的引用,然后像这样注册 WebApi 配置
WebApiConfig.Register(GlobalConfiguration.Configuration);
- 现在使用它,就像这样简单
public class BrandController : ApiController { // GET api/ public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; } // GET api//5 public string Get(int id) { return "value"; } // POST api/ public void Post([FromBody]string value) { } // PUT api//5 public void Put(int id, [FromBody]string value) { } // DELETE api//5 public void Delete(int id) { } }
- 然后你就可以尝试它了。这是 Get(int id) 的结果
这是 Get 的结果
如果你注意到它们是 XML 结果,并且如果你想以 JSON 格式输出,你只需要将这一行添加到你的 WebApiConfig 类中configuration.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
所以它应该看起来像这样
public static void Register(HttpConfiguration configuration) { configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); configuration.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); configuration.Routes.MapHttpRoute( "DefaultApi", "Api/{controller}/{id}", new { id = RouteParameter.Optional } ); }
并且,你不再需要返回字符串和字符串数组,而是可以直接返回你在当前 MVC 项目中已经使用的 ViewModel,它会将其转换为 JSON
// GET Api/<controller> public IEnumerable<BrandViewModel> Get() { var result = brandQuery.GetAll(); return result; } // GET Api/<controller>/5 public BrandViewModel Get(int id) { var result = brandQuery.Get(id); return result; }