Menangani permintaan dengan pengontrol di ASP.NET Core MVC

Oleh Steve Smith dan Scott Addie

Pengontrol, tindakan, dan hasil tindakan adalah bagian mendasar dari cara pengembang membangun aplikasi menggunakan ASP.NET Core MVC.

Apa itu Pengontrol?

Pengontrol digunakan untuk menentukan dan mengelompokkan serangkaian tindakan. Tindakan (atau metode tindakan) adalah metode pada pengontrol yang menangani permintaan. Pengontrol secara logis mengelompokkan tindakan serupa bersama-sama. Agregasi tindakan ini memungkinkan serangkaian aturan umum, seperti perutean, penembolokan, dan otorisasi, diterapkan secara kolektif. Permintaan dipetakan ke tindakan melalui perutean. Pengontrol diaktifkan dan dibuang berdasarkan per permintaan.

Menurut konvensi, kelas pengontrol:

  • Berada di folder Pengontrol tingkat akar proyek.
  • Warisi dari Microsoft.AspNetCore.Mvc.Controller.

Pengontrol adalah kelas instans, biasanya publik, di mana setidaknya salah satu kondisi berikut benar:

  • Nama kelas diabaikan dengan Controller.
  • Kelas mewarisi dari kelas yang namanya ditampung dengan Controller.
  • Atribut [Controller] diterapkan ke kelas .

Kelas pengontrol tidak boleh memiliki atribut terkait [NonController] .

Pengontrol harus mengikuti Prinsip Dependensi Eksplisit. Ada beberapa pendekatan untuk menerapkan prinsip ini. Jika beberapa tindakan pengontrol memerlukan layanan yang sama, pertimbangkan untuk menggunakan injeksi konstruktor untuk meminta dependensi tersebut. Jika layanan hanya diperlukan oleh satu metode tindakan, pertimbangkan untuk menggunakan Injeksi Tindakan untuk meminta dependensi.

Dalam pola ontroller Model-V iew-C, pengontrol bertanggung jawab atas pemrosesan awal permintaan dan instansiasi model. Umumnya, keputusan bisnis harus dilakukan dalam model.

Pengontrol mengambil hasil pemrosesan model (jika ada) dan mengembalikan tampilan yang tepat dan data tampilan terkait atau hasil panggilan API. Pelajari selengkapnya di Gambaran Umum ASP.NET Core MVC dan Mulai menggunakan ASP.NET Core MVC dan Visual Studio.

Pengontrol adalah abstraksi tingkat UI. Tanggung jawabnya adalah memastikan data permintaan valid dan untuk memilih tampilan mana (atau hasil untuk API) yang harus dikembalikan. Di aplikasi yang diperhitungkan dengan baik, aplikasi tersebut tidak secara langsung menyertakan akses data atau logika bisnis. Sebaliknya, pengontrol mendelegasikan ke layanan yang menangani tanggung jawab ini.

Menentukan Tindakan

Metode publik pada pengontrol, kecuali yang memiliki [NonAction] atribut , adalah tindakan. Parameter pada tindakan terikat ke data permintaan dan divalidasi menggunakan pengikatan model. Validasi model terjadi untuk semua yang terikat model. Nilai ModelState.IsValid properti menunjukkan apakah pengikatan dan validasi model berhasil.

Metode tindakan harus berisi logika untuk memetakan permintaan ke masalah bisnis. Masalah bisnis biasanya harus diwakili sebagai layanan yang diakses pengontrol melalui injeksi dependensi. Tindakan kemudian memetakan hasil tindakan bisnis ke status aplikasi.

Tindakan dapat mengembalikan apa pun, tetapi sering mengembalikan instans IActionResult (atau Task<IActionResult> untuk metode asinkron) yang menghasilkan respons. Metode tindakan bertanggung jawab untuk memilih respons seperti apa. Hasil tindakan melakukan respons.

Metode Pembantu Pengontrol

Pengontrol biasanya mewarisi dari Controller, meskipun ini tidak diperlukan. Berasal dari Controller menyediakan akses ke tiga kategori metode pembantu:

1. Metode yang menghasilkan isi respons kosong

Tidak ada Content-Type header respons HTTP yang disertakan, karena isi respons tidak memiliki konten untuk dijelaskan.

Ada dua jenis hasil dalam kategori ini: Pengalihan dan Kode Status HTTP.

  • Kode Status HTTP

    Jenis ini mengembalikan kode status HTTP. Beberapa metode pembantu jenis ini adalah BadRequest, , NotFounddan Ok. Misalnya, return BadRequest(); menghasilkan kode status 400 saat dijalankan. Ketika metode seperti BadRequest, NotFound, dan Ok kelebihan beban, mereka tidak lagi memenuhi syarat sebagai responden Kode Status HTTP, karena negosiasi konten sedang berlangsung.

  • Pengalihan

    Jenis ini mengembalikan pengalihan ke tindakan atau tujuan (menggunakan Redirect, , LocalRedirectRedirectToAction, atau RedirectToRoute). Misalnya, return RedirectToAction("Complete", new {id = 123}); mengalihkan ke Complete, meneruskan objek anonim.

    Jenis hasil Pengalihan berbeda dari jenis Kode Status HTTP terutama dalam penambahan Location header respons HTTP.

2. Metode yang menghasilkan isi respons yang tidak kosong dengan tipe konten yang telah ditentukan sebelumnya

Sebagian besar metode pembantu dalam kategori ini menyertakan ContentType properti, memungkinkan Anda mengatur Content-Type header respons untuk menjelaskan isi respons.

Ada dua jenis hasil dalam kategori ini: Tampilkan dan Respons Terformat.

  • Tampilkan

    Jenis ini mengembalikan tampilan yang menggunakan model untuk merender HTML. Misalnya, return View(customer); meneruskan model ke tampilan untuk pengikatan data.

  • Respons Terformat

    Jenis ini mengembalikan JSon atau format pertukaran data serupa untuk mewakili objek dengan cara tertentu. Misalnya, return Json(customer); menserialisasikan objek yang disediakan ke dalam JSformat ON.

    Metode umum lainnya dari jenis ini termasuk File dan PhysicalFile. Misalnya, return PhysicalFile(customerFilePath, "text/xml"); mengembalikan PhysicalFileResult.

3. Metode yang menghasilkan isi respons yang tidak kosong yang diformat dalam jenis konten yang dinegosiasikan dengan klien

Kategori ini lebih dikenal sebagai Negosiasi Konten. Negosiasi konten berlaku setiap kali tindakan mengembalikan ObjectResult jenis atau sesuatu selain IActionResult implementasi. Tindakan yang mengembalikan non-implementasiIActionResult (misalnya, object) juga mengembalikan Respons Yang Diformat.

Beberapa metode pembantu dari jenis ini termasuk BadRequest, , CreatedAtRoutedan Ok. Contoh metode ini meliputi return BadRequest(modelState);, , return CreatedAtRoute("routename", values, newobject);dan return Ok(value);, masing-masing. Perhatikan bahwa BadRequest dan Ok melakukan negosiasi konten hanya ketika melewati nilai; tanpa diteruskan nilai, nilai tersebut berfungsi sebagai jenis hasil Kode Status HTTP. Metode ini CreatedAtRoute , di sisi lain, selalu melakukan negosiasi konten karena kelebihan beban semuanya mengharuskan nilai diteruskan.

Masalah Lintas Pemotongan

Aplikasi biasanya berbagi bagian dari alur kerja mereka. Contohnya termasuk aplikasi yang memerlukan autentikasi untuk mengakses kelir belanja, atau aplikasi yang menyimpan data di beberapa halaman. Untuk melakukan logika sebelum atau sesudah metode tindakan, gunakan filter. Menggunakan Filter pada masalah pemotongan silang dapat mengurangi duplikasi.

Sebagian besar atribut filter, seperti [Authorize], dapat diterapkan pada tingkat pengontrol atau tindakan tergantung pada tingkat granularitas yang diinginkan.

Penanganan kesalahan dan penembolokan respons sering kali menjadi masalah lintas pemotongan:

Banyak masalah lintas pemotongan dapat ditangani menggunakan filter atau middleware kustom.