asp.net 5 mvc 6 中的 MVC 和 WebApi 可以使用同一个控制器吗?

Can the same controller can be used for MVC and WebApi in asp.net 5 mvc 6?

在 MVC 6 中,MVC 和 WebApi 控制器似乎是相同的。 我有以下代码

[Route("api/[controller]")]
public class TeamController : Controller
{

    public IActionResult Index()
    {
        return View();
    }

    static readonly List<Team> _items = new List<Team>()
    {
        new Team { Id = 1, Name = "First Team" }
    };

    // GET: api/values
    [HttpGet]
    public IEnumerable<Team> Get()
    {
        return _items;
    }
}

我在 Views/Team 文件夹下有 Index.cshtml。 我能够在 localhost:port/api/team 中获得结果,但 localhost:port/Team/Index 返回 404 错误。

那么如何为 MVC 和 WebApi 使用相同的控制器?

您已将路由属性应用于 class

    [Route("api/[controller]")]
    public class TeamController : Controller

因此它将将该路由部分应用于该控制器中的所有内容。您最好在应用程序启动时定义自定义路由。

这是一篇介绍路由的很棒的文章,包括一个混合 MVC/API 控制器: http://stephenwalther.com/archive/2015/02/07/asp-net-5-deep-dive-routing

我把代码改成这样(blog article linked below)

[Route("[controller]")]
public class TeamController : Controller
{
    [HttpGet("Index")]
    public IActionResult Index()
    {
        return View();
    }

    static readonly List<Team> _items = new List<Team>()
    {
        new Team { Id = 1, Name = "First Team" }
    };

    // GET: api/values
    [HttpGet]
    public IEnumerable<Team> Get()
    {
        return _items;
    }

将 class 的 'Route' 属性更改为仅 [controller],然后将 HttpGet 添加到 returns 视图的 Index() 方法。

现在http://myComputer:52687/Team/Index returns the view and http://myComputer:52687/TeamreturnsJSON回复。