asp.net核心“没有路由匹配提供的值”和控制器级别的路由值

时间:2019-09-02 04:57:30

标签: asp.net-core

(通过System.InvalidOperationException: No route matches the supplied values方法发布新项目时,以下控制器将引发CreatedAtRoute异常:

namespace MyApp.Controllers
{
    [ApiController]
    [Route("api/offices/{officeId}/[controller]")]
    public class ResourcesController : ControllerBase
    {
        /* ... */
        [HttpGet]
        public async Task<IActionResult> GetAsync(Guid officeId) =>
            this.Ok(await this.client.GetResourcesAsync(officeId));

        [HttpGet("{id}", Name = "GetResourceById")]
        public async Task<IActionResult> GetAsync(Guid officeId, string id)
        {
            var resource = await this.client.GetResourceAsync(officeId, id);
            return resource == null ? (IActionResult) this.NotFound() : this.Ok(resource);
        }

        [HttpPost]
        public async Task<IActionResult> PostAsync(Guid officeId, Resource resource)
        {
            try
            {
                var result = await this.client.CreateResourceAsync(officeId, resource);
                return this.CreatedAtRoute("GetResourceById", new {officeId, id = resource.Id}, result);
            }
            catch (Exception e)
            {
                this.logger.LogError(e, "Error while creating a resource");
                return this.StatusCode((int)HttpStatusCode.InternalServerError);
            }
        }
    }
}

这是错误还是使用控制器级别指定的路由值的另一种方法?

asp.net核心3(预览版8)上进行了测试。

2 个答案:

答案 0 :(得分:0)

资源的Id值为null,因此传递给该方法的匿名对象缺少 id 值,该值在路由模板和路由上不是可选的找不到。

使用result.Id解决了此问题,因为客户端正在分配ID(由后面的MongoDb实例生成)。

答案 1 :(得分:-1)

我认为这是因为您提供的参数。

在这一行中,您为根提供了2个匿名对象参数,但是您的根包含并要求1个参数。

return this.CreatedAtRoute("GetResourceById", new {officeId, id = resource.Id}, result);

编辑

我认为{id}参数与您的根参数有冲突。

[Route("api/offices/{officeId}/[controller]")]
[HttpGet("{id}", Name = "GetResourceById")]
        public async Task<IActionResult> GetAsync(Guid officeId, string id)
        {
            var resource = await this.client.GetResourceAsync(officeId, id);
            return resource == null ? (IActionResult) this.NotFound() : this.Ok(resource);
        }