ASP.NET 5 Video实体POST成功但报No route matches错误如何解决
问题根源
你的VideosController配置了路由前缀[Route("api/servers/{serverId}/videos")],也就是说该控制器下所有接口的路由都要求必须传入serverId参数。你在PostVideo方法中调用CreatedAtAction生成201响应的Location头时,只传入了id参数,缺少必填的serverId,路由匹配失败就抛出了对应错误,数据能正常入库是因为数据库保存逻辑在返回响应之前就已经执行完成。
解决方案
修改PostVideo方法的CreatedAtAction调用,把serverId也传入路由参数即可:
[HttpPost] public async Task<ActionResult<Video>> PostVideo(Guid serverId, Video video) { // 可选操作:校验serverId对应Server是否存在,避免存入无效关联数据 // 可选操作:自动关联Video和所属Server:video.ServerId = serverId; _context.Videos.Add(video); await _context.SaveChangesAsync(); // 同时传入serverId和id两个路由参数,参数名必须和路由定义完全一致 return CreatedAtAction("GetVideo", new { serverId = serverId, id = video.VideoId }, video); }
如果你的Video实体已经包含ServerId属性,也可以直接用实体的属性值传入:
return CreatedAtAction("GetVideo", new { serverId = video.ServerId, id = video.VideoId }, video);
同类问题排查思路
如果后续遇到同类No route matches the supplied values错误,可按以下顺序排查:
- 检查目标Action的路由所有必填参数是否都已在
CreatedAtAction/CreatedAtRoute的参数列表中传入,参数名称必须和路由定义的名称完全一致,大小写敏感 - 确认传入的参数值类型和路由要求的类型匹配,比如路由要求Guid类型,不要传入字符串类型的参数值
- 检查目标Action的方法名是否拼写正确,
CreatedAtAction的第一个参数是Action的方法名,不能写错
内容的提问来源于stack exchange,提问作者Matheus Reis
相关产品推荐
相关产品推荐

