我怎么能在一个控制器中有多个GET方法

本文关键字:方法 GET 控制器 怎么能 一个 | 更新日期: 2023-09-27 18:03:47

namespace EmployeeApi.Controllers
{
    public class EmployeeDetailsController : ApiController
    {
        // GET api/employeedetails
        public IEnumerable<Employee> Get()
        {

        }

        public IEnumerable<Details> Get(int id)
        {
        }
        public IEnumerable<Team> GetTeamMember()
        {
        }
        public IEnumerable<Details> GetTid(int id)
        {

        }
}

I would like to have my webApi something like this:
1)  IEnumerable<Employee> Get()         -> api/employeedetails
2)  IEnumerable<Details> Get(int id)    -> api/employeedetails/id
3)  IEnumerable<Team> GetTeamMember()   -> api/employeedetails/id/teammember
4)  IEnumerable<Details> GetTid(int id) -> api/employeedetails/id/teammember/tid

我试着改变路线,但由于我是新手,所以不能理解太多。所以,请有人帮助我理解并指导我如何做到这一点。提前感谢..:(

我怎么能在一个控制器中有多个GET方法

您可以使用属性路由来完成此操作。我更喜欢使用它们,因为在读取控制器方法时,它们可以简单地概述如何配置路由。

namespace EmployeeApi.Controllers
{
    public class EmployeeDetailsController : ApiController
    {
        // GET api/employeedetails
        [Route("api/employeedetails")]
        [HttpGet]
        public IEnumerable<Employee> Get()
        {
        }
        // GET api/employeedetails/1
        [Route("api/employeedetails/{id}")]
        [HttpGet]
        public IEnumerable<Details> Get(int id)
        {
        }
        // GET api/employeedetails/id/teammember
        [Route("api/employeedetails/id/teammember")]
        [HttpGet]
        public IEnumerable<Team> GetTeamMember()
        {
        }
        // GET api/employeedetails/id/teammember/1
        [Route("api/employeedetails/id/teammember/{tid}")]
        [HttpGet]
        public IEnumerable<Details> GetTid(int tid)
        {

        }
}

您也可以在控制器顶部使用RoutePrefix,该前缀指定控制器路由的前缀,在您的情况下为"api/employeedetails"。您可以在链接的"路由前缀"部分找到更多详细信息

在相关评论列表增加后,我现在将重新构建我的原始答案。

如果您无法按照Marcus的回答中的建议使用属性路由(请参阅底部的更新声明(,则需要配置您的路由(可能在App_Start/RouteConfig.cs文件中(。你可以在那里尝试以下代码:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapRoute(
            name: "GetEmployeeDetails",
            url: "api/employeedetails",
            defaults: new { controller = "EmployeeDetails", action = "GetEmployees" }
        );
        routes.MapRoute(
            name: "GetEmployeeDetailsById",
            url: "api/employeedetails/{employeeId}",
            defaults: new { controller = "EmployeeDetails", action = "GetDetails", employeeId = UrlParameter.Optional }
        );
        routes.MapRoute(
            name: "GetTeamMember",
            url: "api/employeedetails/{employeeId}/teammember",
            defaults: new { controller = "EmployeeDetails", action = "GetTeams", employeeId = UrlParameter.Optional }
        );
        routes.MapRoute(
            name: "GetTeamMemberById",
            url: "api/employeedetails/{employeeId}/teammember/{teamId}",
            defaults: new { controller = "EmployeeDetails", action = "GetDetailsForTeam", employeeId = UrlParameter.Optional, teamId = UrlParameter.Optional }
        );
    }
}

可能会有更多的路由(例如,通用默认路由(,也会有路由被忽略,但这超出了这个问题的范围。

这些路由与控制器类中的以下操作方法相对应:

public class EmployeeDetailsController : Controller
{
    public IEnumerable<Employee> GetEmployees()
    {
        // Get your list of employees here
        return ...;
    }
    public IEnumerable<Detail> GetDetails(int employeeId = 0)
    {
        // Get your list of details here
        return ...;
    }
    public IEnumerable<Team> GetTeams(int employeeId = 0)
    {
        // Get your list of teams here
        return ...;
    }
    public IEnumerable<Detail> GetDetailsForTeam(int employeeId = 0, int teamId = 0)
    {
        // Get your list of details here
        return ...;
    }
}

GetDetailsForTeam()方法可能不需要employeeId参数,因为teamId可能足以获得所需信息。如果是这种情况,您可以从操作方法相应的路由中删除该参数。

这些路由配置非常简单。每条路由都需要一个唯一的名称,否则将导致运行时错误。url包含路由应该处理的url。然后,您可以指定控制器名称、要调用的操作方法(这些是您的Get方法(及其各自的参数。

关于命名约定的一两句话:在一个名为EmployeeDetailsController的控制器中,我希望每个"通用命名"的操作方法都返回一个或多个EmployeeDetails对象(或它们各自的ActionResult(。因此,一个简单的Get()方法应该返回一个或多个EmployeeDetails对象。

如果您想返回不同类型的对象,我会选择特定的名称(如上面代码中所建议的(。在您的情况下,这将是GetEmployees()方法、GetDetails(int employeeId = 0)方法、GetTeams(int employeeId = 0)方法和GetDetailsForTeam(int employeeId = 0, int teamId = 0)方法。请注意此处的可选参数。

如果你有这些方法,我会从路由开始。你需要确保每条路线都可以连接到一个动作方法;这就是为什么我要求在其中一条评论中提供完整的URL。如果你一直收到"发现多个操作"的错误,那么你的路由URL没有以这种方式配置。

此外,请注意,路线顺序确实很重要,尽管在您的示例中,我没有看到任何冲突的路线。

UPDATE:作为一种替代方案,您可以使用属性路由,将所需的路由直接放入控制器内操作方法的属性中。但要使其与ASP.NET MVC 4配合使用,您需要安装AttributeRouting NuGet包。