【问题标题】:No route matches the supplied values for HTTP POST没有路由与为 HTTP POST 提供的值匹配
【发布时间】:2020-11-28 03:48:58
【问题描述】:

我正在制作一个 POST 方法。以下代码接收一个对象,从它想要的对象中获取数据,然后将其格式化为一个新对象并将其保存到数据库中。我使用以下代码:

        [HttpPost]
        public async Task<IActionResult> Create (Course course) {

            // Generate the object "newCourse" from the data I want

            // Save changes
            _context.Courses.Add(newCourse);
            await _context.SaveChangesAsync();

            // Return 201
            return CreatedAtAction(nameof(newCourse), newCourse);
        }

我收到以下错误:

System.InvalidOperationException: No route matches the supplied values.
   at Microsoft.AspNetCore.Mvc.CreatedAtActionResult.OnFormatting(ActionContext context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor.ExecuteAsyncCore(ActionContext context, ObjectResult result, Type objectType, Object value)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor.ExecuteAsync(ActionContext context, ObjectResult result)
   at Microsoft.AspNetCore.Mvc.ObjectResult.ExecuteResultAsync(ActionContext context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultAsync(IActionResult result)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeNextResultFilterAsync[TFilter,TFilterAsync]()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

据我从其他堆栈溢出问题了解到,此错误是(2016 年)由以“异步”结尾的路由方法的错误引起的,该错误已修复。但是,我使用的是最新版本,并且我的方法不包含短语“Async”,所以这不是我遇到的问题。我认为这是 CreatedAtAction 的问题。我可能做错了什么?

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-core asp.net-web-api


    【解决方案1】:

    您的问题是因为您提供了一个具体的类作为对象参数,它需要对象所以

    return CreatedAtAction(nameof(newCourse), newCourse);

    应该是

    return CreatedAtAction(nameof(newCourse), new { newCourse });

    【讨论】:

      【解决方案2】:

      我认为我们的第一个论点有问题。第二个参数传递正确。

      方法CreatedAtAction(string actionName, object value) 接受两个参数,第一个是动作的名称。似乎同一个控制器内部没有newCourse 方法。

      CreatedAtAction 接受操作名称以创建 Location 标头,该标头通常与遵循 REST 约定的 201 响应代码一起返回。它是一个 uri,可用于检索新创建的资源。

      这是一个示例,如果您有两种方法,一种用于 Get,另一种用于 Create。假设您有一些 id 参数用于 Get 方法。

      [HttpGet]
      public async Task<IActionResult> Get(string id) {
           ...
      }
      
      [HttpPost]
      public async Task<IActionResult> Create (Course course) {
          var newCourse = ...
          
          _context.Courses.Add(newCourse);
          await _context.SaveChangesAsync();
      
          return CreatedAtAction("Get", new {id = course.Id}, newCourse);
      }
      

      CreatedAtAction documentation

      【讨论】:

        【解决方案3】:

        我通过更改解决了这个问题

        return CreatedAtAction(nameof(newCourse), newCourse);
        

        return CreatedAtAction("Create", newCourse);
        

        我认为 nameof(newCourse) 不是我尝试使用的重载的正确 actionName 参数。 Overload docs page。我将其更改为函数的名称。 注意 - 当我尝试字符串“Created”时它不起作用,只有“Create”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-03
          • 2018-04-28
          • 1970-01-01
          • 1970-01-01
          • 2010-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多