Saya membuat metode POST. Kode berikut mengambil objek, mengambil data dari objek yang diinginkan, lalu memformatnya menjadi objek baru dan menyimpannya ke database. Saya menggunakan kode berikut:

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

Saya mendapatkan kesalahan berikut:

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)

Dari yang saya pahami dari pertanyaan stack overflow lainnya, kesalahan ini (pada 2016) disebabkan oleh bug dengan metode perutean yang diakhiri dengan "Async" yang telah diperbaiki. Namun, saya menggunakan versi terbaru dan metode saya tidak mengandung frasa "Async", jadi ini bukan masalah yang saya miliki. Saya percaya itu menjadi masalah dengan CreatedAtAction. Apa yang mungkin saya lakukan salah?

0
skelegorg 28 November 2020, 06:48

3 jawaban

Jawaban Terbaik

Saya memperbaiki masalah dengan mengubah

return CreatedAtAction(nameof(newCourse), newCourse);

Untuk

return CreatedAtAction("Create", newCourse);

Saya percaya bahwa nameof(newCourse) bukan parameter actionName yang benar untuk kelebihan yang saya coba gunakan.

Masalah Anda adalah karena Anda menyediakan kelas konkret sebagai parameter objek dan itu membutuhkan objek jadi

return CreatedAtAction(nameof(newCourse), newCourse);

Seharusnya

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

0
nalnpir 28 November 2020, 04:01