如何为API创建MVC区域?

时间:2015-07-12 19:59:33

标签: asp.net-web-api controller asp.net-mvc-5 asp.net-mvc-areas

我创建了一个新的MVC项目,并勾选了API的框。

但是,我打算创建许多API函数,我真的不想填满主控制器文件夹,因此,我认为这对一个区域来说是个很好的用途。

所以,我创建了一个名为API的区域,但是,无论我做什么,我似乎都无法访问任何API页面。

为了测试,我在API区域创建了另一个名为test的控制器,我可以按预期访问并执行所有操作。

我直接从MVC2 / 3开始,然后休息了几年......我有点失控,我相信这可能与/App_Start/WebApiConfig.cs/Global.asax文件有关但是,我试图以各种方式编辑它们而没有任何运气。

有谁知道发生了什么以及我需要做些什么才能让API功能在某个区域运行?

1 个答案:

答案 0 :(得分:2)

您不需要为Api控制器创建区域,但您的Api控制器必须从ApiController派生才能获取。只需将控制器组织在文件夹中,而不是创建区域,只要控制器遵循惯例,它们就会被WebApi选中。

在您的WebApiConfig.cs中,您可以定义路线,但我建议您使用Attribute Based Routing。那么对于每个"区域"你可以创建一个基本api控制器并在类上粘贴`[RoutePrefix(" api / areaName")]属性 - 然后对于该区域中的每个控制器,你只需从该基本控制器派生。

以下是"用户"的快速示例。 api控制器。通过下面的示例,您将能够使用以下网址:

请记住在WebApiConfig课程中启用基于属性的路由。

<强> WebApiConfig.cs

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
    }
}

<强> UsersApiController.cs

[RoutePrefix("api/users")]
public class UsersApiController : ApiController 
{
        List<User> _users = new List<User> { new User("Foo", "Bar"), new User("Bar", "Foo") };

        [Route("")]
        public IHttpActionResult Get()
        {
            var result = _users;

            return Ok(result);
        }

        [Route("{id:guid}")]
        public IHttpActionResult Get(Guid id)
        {
            var result = _users.FirstOrDefault(q => q.Id == id);

            if (result == null)
                return NotFound();

            return Ok(result);
        }        

        [Route("")]
        public IHttpActionResult Post([FromBody]PostModel model)
        {
            // Process the input model
            var user = new User(model.FirstName, model.LastName);

            // Save user to database
            _users.Add(user);           

            return Created<User>(Request.RequestUri + user.Id.ToString(), user);
        }

        public class PostModel 
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
        }

        public class User
        {
            public User(string firstName, string LastName)
            {
                Id = Guid.NewGuid();
                FirstName = firstName;
                LastName = lastName;
            }

            public Guid Id { get; private set; }
            public string FirstName { get; private set; }
            public string LastName { get; private set; }        
        }
}