在相关 cmets 列表增加后,我现在将重组我原来的答案。
如果您无法按照 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 对象(或它们各自的ActionResults)。因此,一个简单的Get() 方法应该返回一个或多个EmployeeDetails 对象。
如果您想返回不同类型的对象,我会选择特定的名称(如我上面的代码中所建议的那样)。在您的情况下,这将是 GetEmployees() 方法、GetDetails(int employeeId = 0) 方法、GetTeams(int employeeId = 0) 方法和 GetDetailsForTeam(int employeeId = 0, int teamId = 0) 方法。注意这里的可选参数。
如果您有这些方法,我将从路由开始。您需要确保每条路由都可以连接到一个确切的操作方法;这就是为什么我要求在其中一个 cmets 中提供完整的 URL。如果您不断收到“找到多个操作”错误,则说明您的路由 URL 未以这种方式配置。
另外请注意,路线顺序确实很重要,尽管在您的示例中我没有看到任何冲突的路线。
更新: 作为替代方案,您可以使用属性路由,将所需路由直接放入控制器内的操作方法的属性中。但要使其与 ASP.NET MVC 4 一起使用,您需要安装 AttributeRouting NuGet package。