在EF Core 2中,CreatedAtAction将参数附加为api / sample?id = 1。如何配置它以返回api / sample / 1?
[ApiController]
[Authorize]
[Route("api/[controller]")]
public class MyController : ControllerBase
{
[HttpGet("{id}")]
public async Task<IActionResult> Get(int id)
{
var entity = await service.GetAsync(id);
if (entity == null)
return NotFound(entity);
return Ok(entity);
}
[HttpPut]
// Other codes are omitted for brevity
public async Task<IActionResult> Create([FromBody] Entity entity)
{
await service.AddAsync(entity);
await service.SaveAsync();
return CreatedAtAction(action, new { id = entity.Id }, entity);
}
}
答案 0 :(得分:3)
那是因为操作的路由模板。
最有可能是由于默认的基于约定的路由。
可以通过将属性路由放置在具有预期路线模板的预期动作上来解决此问题
[Route(api/[controller])]
public class SampleController : Controller {
//GET api/sample/1
[HttpGet("{id}")]
public IActionResult Get(int id) {
//...
}
//POST api/sample
[HttpPost]
public IActionResult Post(Sample model) {
//...
return CreatedAtAction(nameof(Get), new { id = model.Id }, model);
}
}
并确保在创建结果时使用正确的操作名称。上面的示例使用了Get
操作,因此在创建的响应中为Location
生成URL时将使用其路由模板。