C# 如何在单个控制器中有多个GET方法 名称空间EmployeeApi.Controllers { 公共类EmployeeDetails控制器:ApiController { //获取api/employeedetails 公共IEnumerable Get() { } 公共IEnumerable Get(int-id) { } public IEnumerable GetTeamMember() { } 公共IEnumerable getId(int-id) { } } 我希望我的webApi如下所示: 1) IEnumerable Get()->api/employeedetails 2) IEnumerable Get(int id)->api/employeedetails/id 3) IEnumerable GetTeamMember()->api/employeedetails/id/teammember 4) IEnumerable getId(int-id)->api/employeedetails/id/teammember/tid
我试着改变路线,但由于我是新手,不太懂,所以,请有人帮我理解并指导我该如何做。C# 如何在单个控制器中有多个GET方法 名称空间EmployeeApi.Controllers { 公共类EmployeeDetails控制器:ApiController { //获取api/employeedetails 公共IEnumerable Get() { } 公共IEnumerable Get(int-id) { } public IEnumerable GetTeamMember() { } 公共IEnumerable getId(int-id) { } } 我希望我的webApi如下所示: 1) IEnumerable Get()->api/employeedetails 2) IEnumerable Get(int id)->api/employeedetails/id 3) IEnumerable GetTeamMember()->api/employeedetails/id/teammember 4) IEnumerable getId(int-id)->api/employeedetails/id/teammember/tid,c#,asp.net-mvc-4,asp.net-web-api,C#,Asp.net Mvc 4,Asp.net Web Api,我试着改变路线,但由于我是新手,不太懂,所以,请有人帮我理解并指导我该如何做。 提前感谢。:)相关评论列表增加后,我现在将重新构建我的原始答案 如果您无法按照Marcus的回答中的建议使用属性路由(请参阅底部的我的更新语句),则需要配置路由(可能在App_Start/RouteConfig.cs文件中)。您可以在那里尝试以下代码: namespace EmployeeApi.Controllers { public class EmployeeDetailsController : Ap
提前感谢。:)相关评论列表增加后,我现在将重新构建我的原始答案 如果您无法按照Marcus的回答中的建议使用属性路由(请参阅底部的我的更新语句),则需要配置路由(可能在App_Start/RouteConfig.cs文件中)。您可以在那里尝试以下代码:
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
可能会有更多的路由(例如,一个通用的默认路由)以及要忽略的路由,但如果这个问题不在范围之内,这是不可能的
这些路由与控制器类中的以下操作方法相对应:
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 }
);
}
}
公共类EmployeeDetailsController:控制器
{
公共IEnumerable GetEmployees()
{
//在这里获取您的员工名单
返回。。。;
}
public IEnumerable GetDetails(int-employeeId=0)
{
//在这里获取您的详细信息列表
返回。。。;
}
公共IEnumerable GetTeam(int-employeeId=0)
{
//在这里获取您的团队列表
返回。。。;
}
public IEnumerable GetDetailsFortam(int-employeeId=0,int-teamId=0)
{
//在这里获取您的详细信息列表
返回。。。;
}
}
对于GetDetailsForTeam()
方法,您可能不需要employeeId
参数,因为teamId
可能足以获得所需的信息。如果是这种情况,您可以从操作方法和相应的路由中删除该参数
这些路由配置非常简单。每个路由都需要一个唯一的名称,否则将导致运行时错误。url-很好-包含路由应该处理的url。然后,您可以指定控制器名称、要调用的操作方法(这些是您的Get
方法)以及它们各自的参数
关于命名约定的一两句话:在名为EmployeeDetailsController
的控制器中,我希望每个“通用命名”操作方法都返回一个或多个EmployeeDetails
对象(或它们各自的ActionResult
s)。因此,一个简单的Get()
方法应返回一个或多个EmployeeDetails
对象
如果您想返回不同类型的对象,我会选择特定的名称(如上面代码中所建议的)。在您的情况下,这将是一个GetEmployees()
方法、一个GetDetails(int employeeId=0)
geteams(int employeeId=0)方法和一个getDetailsFoream(int-employeeId=0,int-teamId=0)
method。请注意此处的可选参数
如果您有这些方法,我将从路由开始。您需要确保每个路由都可以连接到一个操作方法;这就是为什么我在其中一条评论中要求提供完整的URL。如果您一直收到“找到多个操作”错误,则您的路由URL没有以这种方式配置
另外请注意,路线顺序确实很重要,尽管在您的示例中,我没有看到任何冲突的路线
更新:作为替代,您可以使用属性路由,将所需路由直接放入控制器内操作方法的属性中。但要使用ASP.NET MVC 4,您需要安装。您可以使用。
我更喜欢使用它们,因为在阅读controllers方法时,它们提供了一个关于如何配置路由的简单概述
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 ...;
}
}
名称空间EmployeeApi.Controllers
{
公共类EmployeeDetails控制器:ApiController
{
//获取api/employeedetails
[路线(“api/员工详情”)]
[HttpGet]
公共IEnumerable Get()
{
}
//获取api/employeedetails/1
[路线(“api/employeedetails/{id}”)]
[HttpGet]
公共IEnumerable Get(int-id)
{
}
//获取api/employeedetails/id/teammember
[路线(“api/employeedetails/id/teammember”)]
[HttpGet]
public IEnumerable GetTeamMember()
{
}
//获取api/employeedetails/id/teammember/1
[路线(“api/employeedetails/id/teammember/{tid}”)]
[HttpGet]
公共IEnumerable getId(int-tid)
{
}
}
您还可以在指定控制器路由前缀的控制器顶部使用RoutePrefix,在您的示例中为“api/employeedetails”。您可以在“路由前缀”中找到更多详细信息linkGetTid函数中的节只需要tid作为单个参数,那么您可能需要在函数声明中将该参数重命名为
tid
。但是teammember
URL中的id
又如何呢?这些id不是具有实际值的id吗?层次结构应该如下1)employeedetails应显示empid列表,2)employeedetails/id应显示特定empid的详细信息3)employeedetails/id/团队成员应显示empid是否有团队成员4)Employee
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)
{
}
}