使用路由属性

时间:2016-02-26 14:19:45

标签: c# asp.net asp.net-web-api

我在控制器中有一个动作方法: -

[RoutePrefix("api/forces")]
public class ForceController : Controller
{
   [HttpGet]
   [Route("{showAll?}")]
   public IHttpActionResult GetForces(bool? showAll)
   {
       IEnumerable<Force> forces=  forceRepository.GetAll().ToList();
       if(!showAll)
        {
            forces = forces.ToList().Where(u => u.IsActive);
        }
       return Ok(new { data= forces, message = "The forces are with you" });
   }
}

我希望下面的两个网址都被路由到行动

api/forces
api/forces/true

我认为当前的路由属性可以工作,但它只适用于第二个url,即api / forces / true,而不是第一个。 API /用户。

3 个答案:

答案 0 :(得分:4)

查看Attribute Routing in ASP.NET Web API 2: Optional URI Parameters and Default Values

  

您可以通过向问题添加问号来使URI参数成为可选项   路线参数。如果route参数是可选的,则必须定义a   方法参数的默认值。

[RoutePrefix("api/forces")]
public class ForceController : Controller {
   [HttpGet]
   [Route("{showAll:bool?}")]
   public IHttpActionResult GetForces(bool? showAll = true) {...}
}
  

在此示例中,/api/forces/api/forces/true返回相同的资源。

或者,您可以在路径模板中指定默认值,如下所示:

[RoutePrefix("api/forces")]
public class ForceController : Controller {
   [HttpGet]
   [Route("{showAll:bool=true}")]
   public IHttpActionResult GetForces(bool? showAll) {...}
}

答案 1 :(得分:3)

您可以使用默认路由[Route()],它会强制showAll参数通过查询字符串传递。那会接受

/api/forces
/api/forces?showAll=true
/api/forces?showAll=false

答案 2 :(得分:1)

您需要为showAll参数提供一个值,因为它不是可选的(可以为空)不计算。使其成为可选项应解决问题。

[HttpGet]
[Route("{showAll?}")]
public IHttpActionResult GetForces(bool? showAll = null)
{
    ...
}