Web Api路由选择特定的泛型

时间:2017-01-18 09:39:05

标签: c# jquery asp.net ajax asp.net-mvc

嗨,大家好我是网络api路由的新手,我有这个问题,我的电话会在特定的电话上选择更通用的电话。 我有的ajax电话是

   $.getJSON("/api/solutions/GetSolutionByCategory/" + categoryId,
                        function (data) {//..some other functions}

在解决方案控制器中有2种方法

     [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>));
    }

然后我有以下3条路线

        config.Routes.MapHttpRoute(
            name: "WithAction",
            routeTemplate: "api/{controller}/GetIssuesByFlag/{flag}",
            defaults: new {flag = 3}
        );
        config.Routes.MapHttpRoute(
            name: "SolutionByCategory",
            routeTemplate: "api/{controller}/GetSolutionByCategory/{categoryId}",
            defaults: new {categoryId = -1}
        );
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new {id = RouteParameter.Optional}
        );

我的ajax调用会忽略第二个我希望它命中的那个并转到那里的第三个而不是调用GetSolutionsByCategory它命中通用的GetSolutions

我在这里做错了什么?

2 个答案:

答案 0 :(得分:4)

您的操作参数名称中存在拼写错误,其int cateogryId而不是int categoryId - public IHttpActionResult GetSolutionByCategory(int categoryId)

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

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

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

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

}

答案 1 :(得分:0)

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

我们可以提供约束以及属性路由。