带有可选参数/默认参数值的ASP.NET5 MVC 6 routung

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

Nko*_*osi 9

可选的URI参数和默认值

您可以通过向路由参数添加问号来使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/10api/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.但是,您可以插入自定义模型绑定器,这可能会做一些不同的事情.