我在控制器中有一个动作方法: -
[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 /用户。
答案 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)
{
...
}