65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2014年9月15日

CPOL

2分钟阅读

viewsIcon

16056

可能你像我一样,开始在你的 MVC 应用中集成 AngularJS 或任何其他 JS 框架,然后才发现你需要将很多结果转换为处理这些调用。虽然这在使用 MVC 控制器时有效,但你总是需要将结果序列化为 JSON 格式并启用

可能你像我一样,开始在你的 MVC 应用中集成 AngularJS 或任何其他 JS 框架,然后才发现你需要将很多结果转换为处理这些调用。虽然这在使用 MVC 控制器时有效,但你总是需要将结果序列化为 JSON 格式并启用客户端 GET 请求,例如这样。

1 Return JSON

那么如何避免这种情况呢?

通过使用 API Controllers

那么这两者有什么区别呢?很简单,Controllers 返回一个 View,而 ApiController 返回序列化的数据给客户端。现在你明白为什么会使用它了吧?因为如果你使用任何抓取数据的 JavaScript 框架,那么 ApiControllers 就更有意义了,因为它就是为此设计的。它们专门用于返回数据,并负责透明地将数据序列化为客户端请求的格式。它们还提供 RESTful API,因为它们默认遵循不同的路由方案。虽然控制器也可以做到这一点,但你必须进行大量的手动编码才能实现。

现在,如果我当前已经有一个 MVC 应用,该如何添加它呢?如果你是从头开始,可以选择 Web API 项目,如下所示

2 Web API

但是,如果你的项目已经在运行,请按照以下步骤操作。

  1. 添加对 System.Web.Http.WebHost 的引用。
    3 Add WebHost Reference
  2. App_Start 文件夹中创建一个名为 WebApiConfig.cs 的新类
    4 New WebApi Class
    然后像这样注册你的路由

     

    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 }
                );
        }
    }
  3. 修改 Global.asax.cs 以首先注册 WebApiConfiguration,方法是添加对 System.Web.Http 的引用,然后像这样注册 WebApi 配置
    WebApiConfig.Register(GlobalConfiguration.Configuration);

    5 Modify Global ASAX

  4. 现在使用它,就像这样简单
    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)
        {
        }
    }
  5. 然后你就可以尝试它了。这是 Get(int id) 的结果
    6 Result 2
    这是 Get 的结果
    6 Result
    如果你注意到它们是 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;
    }
© . All rights reserved.