Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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”。您可以在“路由前缀”中找到更多详细信息link

GetTid函数中的节只需要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)
        {


        }
}