ASP.NET5 MVC 6路由带有可选参数/默认参数值

时间:2016-04-16 19:04:37

标签: c# model-view-controller routing asp.net5

我在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

2 个答案:

答案 0 :(得分:7)

<强> Optional URI Parameters and Default Values

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

[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直接分配给method参数,因此参数将具有此精确值。

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

答案 1 :(得分:0)

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

错误

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

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

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

Startup.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);
}