8

我正在 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);
}

当我打电话时它就可以工作- 我从数据库api/report/machine/[machineName]-5接收文件。5

但我想cnt使用默认值使参数可选 - 所以调用api/report/machine/[machineName]是有效的。

基于http://stephenwalther.com/archive/2015/02/07/asp-net-5-deep-dive-routing我到目前为止尝试过:

[HttpGet("machine/{machineId}-{cnt:int=10}")]- 控制器不捕捉api/machine/{machineName}(我得到欢迎页面代码)

[HttpGet("machine/{machineId}-{cnt?}")]- 应用程序无法启动(我什至没有获得 MVC 欢迎页面)

[HttpGet("machine/{machineId}-{cnt:int?}")]- 应用程序无法启动(如上)

有任何想法吗?

整个控制器的代码(我没有指定任何其他路线): http: //pastebin.pl/view/11050284

4

2 回答 2

16

可选 URI 参数和默认值

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

[HttpGet("machine/{machineId}/{cnt:int?}")]
public IActionResult GetReportsByMachineId(string machineId, int cnt = 10) {...}

在本例中,api/report/machine/nazwa_maszyny/10api/report/machine/nazwa_maszyny返回相同的资源。

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

[HttpGet("machine/{machineId}/{cnt:int=10}")]
public IActionResult GetReportsByMachineId(string machineId, int cnt) {...}

这与前面的示例几乎相同,但应用默认值时的行为略有不同。

  • 在第一个示例(“{cnt:int?}”)中,默认值 10 直接分配给方法参数,因此参数将具有此精确值。

  • 在第二个示例(“{cnt:int=10}”)中,默认值“10”通过模型绑定过程。默认模型绑定器会将“10”转换为数值 10。但是,您可以插入自定义模型绑定器,这可能会做一些不同的事情。

于 2016-04-16T20:19:37.257 回答
0

我几乎可以正常工作,当我传递 CompanyID 时,网址可以正常工作,但如果我将其留空,则默认为 00000-00000-00000 等。问题是我无法根据函数指定默认 guid。

错误

public async Task<IActionResult> Edit(Guid CompanyId = GetCurrentUserAsync().Result.CompanyId, Guid? id)

这是无效的,因为默认值必须是编译时间常数。

有没有办法使用 GetCurrentUserAsync().Result.CompanyId 作为默认值而不检查每个函数 if(CompanyId == Guid.Empty) GetCurrentUserAsync().Result.CompanyId

启动.cs

routes.MapRoute(name: "areaRoute", template: "{area:exists}/{CompanyId?}/{controller}/{action=Index}/{id?}");

控制器

public async Task<IActionResult> Edit(Guid CompanyId, Guid? id)
{
    if (id == null)
    {
        return NotFound();
    }
    var companyCredential = await _context.CompanyCredential.Where(p => p.CompanyId == CompanyId).SingleOrDefaultAsync(m => m.Id == id);
    if (companyCredential == null)
    {
        return NotFound();
    }
    ViewData["CompanyId"] = new SelectList(_context.Company, "Id", "Id", companyCredential.CompanyId);
    return View(companyCredential);
}
于 2017-04-13T18:55:37.017 回答