Warm tip: This article is reproduced from serverfault.com, please click

No route matches the supplied values for HTTP POST

发布于 2020-11-28 03:48:58

I am making a POST method. The following code takes in an object, takes the data from the object that it wants, then formats it into a new object and saves that to the database. I use the following code:

        [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);
        }

I get the following error:

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)

From I understand from other stack overflow questions, this error was (in 2016) caused by a bug with routing methods that ended in "Async" that was fixed. However, I am on the newest version and my method does not contain the phrase "Async", so this cannot be the problem I have. I believe it to be an issue with the CreatedAtAction. What might I be doing wrong?

Questioner
skelegorg
Viewed
0
skelegorg 2020-11-29 07:44:01

I fixed the issue by changing

return CreatedAtAction(nameof(newCourse), newCourse);

to

return CreatedAtAction("Create", newCourse);

I believe that the nameof(newCourse) was not the correct actionName parameter for the overload I was trying to use. Overload docs page. I changed it to the name of the function. note- it did not work when i tried the string "Created", only "Create".