我在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
答案 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/10
和api/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);
}