C# Web Api路由选择通用路由而不是特定路由

C# Web Api路由选择通用路由而不是特定路由,c#,jquery,asp.net,ajax,asp.net-mvc,C#,Jquery,Asp.net,Ajax,Asp.net Mvc,大家好,我是WebAPI路由的新手,我遇到了这个问题,我的调用将选择更通用的路由,而不是特定的路由。 我的ajax调用是 $.getJSON("/api/solutions/GetSolutionByCategory/" + categoryId, function (data) {//..some other functions} 在solutions controller中有两种方法 [HttpGet] public

大家好,我是WebAPI路由的新手,我遇到了这个问题,我的调用将选择更通用的路由,而不是特定的路由。 我的ajax调用是

   $.getJSON("/api/solutions/GetSolutionByCategory/" + categoryId,
                        function (data) {//..some other functions}
在solutions controller中有两种方法

     [HttpGet]
    public IHttpActionResult GetSolutionByCategory(int cateogryId)
    {
        List<Solution> solutions = _context.Solutions.Where(s => s.CategoryId == cateogryId).ToList();
        return Ok(solutions.Select(Mapper.Map<Solution, SolutionDto>));
    }
    [HttpGet]
    public IHttpActionResult GetSolutions()
    {
        return Ok(_context.Solutions.ToList().Select(Mapper.Map<Solution, SolutionDto>));
    }
发生的情况是,我的ajax调用将忽略我希望它命中的第二个,并转到第三个,而不是调用它命中的一般GetSolutions的GetSolutionsByCategory


我在这里做错了什么?

您的操作参数名称中有一个输入错误,它是
int categoryId
而不是
int categoryId
-
public IHttpActionResult GetSolutionByCategory(int categoryId)

但是,我建议您选择属性路由,而不是添加大量路由配置。在web api配置类中启用属性路由-
config.maphttpAttribute路由()和在控制器中:

[RoutePrefix("api")]
public class SolutionsController:ApiController
{

    [HttpGet]
    [Route("GetSolutionByCategory/{categoryId})"]
    public IHttpActionResult GetSolutionByCategory(int categoryId)
    {
        ....
    }

    [HttpGet]
    [Route("GetSolutions")]
    public IHttpActionResult GetSolutions()
    {
        ...
    }

}

操作参数名称中有一个输入错误,它的
int categoryId
而不是
int categoryId
-
public IHttpActionResult GetSolutionByCategory(int categoryId)

但是,我建议您选择属性路由,而不是添加大量路由配置。在web api配置类中启用属性路由-
config.maphttpAttribute路由()和在控制器中:

[RoutePrefix("api")]
public class SolutionsController:ApiController
{

    [HttpGet]
    [Route("GetSolutionByCategory/{categoryId})"]
    public IHttpActionResult GetSolutionByCategory(int categoryId)
    {
        ....
    }

    [HttpGet]
    [Route("GetSolutions")]
    public IHttpActionResult GetSolutions()
    {
        ...
    }

}

使用属性路由,我们可以使用多个get和post方法拥有相同的控制器。我们需要在操作方法上添加路由


我们还可以通过属性路由提供约束

使用属性路由,我们可以让同一个控制器具有多个get和post方法。我们需要在操作方法上添加路由


我们还可以通过属性路由提供约束

除了这种基于约定的路由,您还可以使用属性路由,您可以在FYI上找到一个好信息:在
SolutionByCategory
路由中使用
默认值:new{categoryId=-1}
。提供默认的
categoryId
使
categoryId
成为可选的。人们希望
GetSolutionByCategory
需要一个
catgoryId
才能工作。除了基于此约定的路由,您还可以使用属性路由,您可以在FYI上找到一个好信息:拥有
默认值:在
SolutionByCategory
路由中新建{categoryId=-1}
,听起来像是个错误。提供默认的
categoryId
使
categoryId
成为可选的。您可能希望
GetSolutionByCategory
需要
catgoryId
才能工作。谢谢!不知道我是怎么错过的,谢谢你的信息,我也会看看的!无法标记为正确,但在计时器启动时将执行正确的回答。但这里的关键点是,属性路由可能就是您要寻找的。@smoksnes-没错;我已经把这个加到我的回答中了谢谢!不知道我是怎么错过的,谢谢你的信息,我也会看看的!无法标记为正确,但在计时器启动时将执行正确的回答。但这里的关键点是,属性路由可能就是您要寻找的。@smoksnes-没错;我已经在我的答案[Route({id:int}])[Route({id:int}])中添加了这一点