luk*_*pep 3 c# asp.net-core asp.net-core-routing
我正在VS2015,C#,ASP.NET5 MVC6堆栈中构建Restful样式API,在路由方面我遇到了一些麻烦.我直接在控制器中使用注释:
[HttpGet("machine/{machineId}-{cnt:int}")]
public IActionResult GetReportsByMachineId(string machineId, int cnt)
{
var item = _reportRepository.GetReportsByMachineId(machineId, 0, cnt);
if ((item == null) || (!item.Any()) )
{
return HttpNotFound();
}
return new ObjectResult(item);
}
Run Code Online (Sandbox Code Playgroud)
它在我打电话时起作用api/report/machine/[machineName]-5- 我从数据库收到5个文件.
但我想5使用默认值使参数可选 - 所以调用cnt将是有效的.
基于http://stephenwalther.com/archive/2015/02/07/asp-net-5-deep-dive-routing我到目前为止尝试过:
api/report/machine/[machineName]- 控制器没有捕获[HttpGet("machine/{machineId}-{cnt:int=10}")](我得到欢迎页面代码)
api/machine/{machineName} - 应用程序无法启动(我甚至没有获得MVC欢迎页面)
[HttpGet("machine/{machineId}-{cnt?}")] - 应用程序无法启动(如上所述)
有任何想法吗?
整个控制器的代码(我没有指定任何其他路线):http: //pastebin.pl/view/11050284
您可以通过向路由参数添加问号来使URI参数可选.如果route参数是可选的,则必须为method参数定义默认值.
[HttpGet("machine/{machineId}/{cnt:int?}")]
public IActionResult GetReportsByMachineId(string machineId, int cnt = 10) {...}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,api/report/machine/nazwa_maszyny/10并api/report/machine/nazwa_maszyny返回相同的资源.
或者,您可以在路径模板中指定默认值,如下所示:
[HttpGet("machine/{machineId}/{cnt:int=10}")]
public IActionResult GetReportsByMachineId(string machineId, int cnt) {...}
Run Code Online (Sandbox Code Playgroud)
这与前一个示例几乎相同,但在应用默认值时,行为略有不同.
在第一个示例("{cnt:int?}")中,默认值10直接分配给方法参数,因此参数将具有此精确值.
在第二个示例("{cnt:int = 10}")中,默认值"10"通过模型绑定过程.默认的模型绑定器将"10"转换为数值10.但是,您可以插入自定义模型绑定器,这可能会做一些不同的事情.