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
, ,NotFound
danOk
. Misalnya,return BadRequest();
menghasilkan kode status 400 saat dijalankan. Ketika metode sepertiBadRequest
,NotFound
, danOk
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
, ,LocalRedirect
RedirectToAction
, atauRedirectToRoute
). Misalnya,return RedirectToAction("Complete", new {id = 123});
mengalihkan keComplete
, 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 format JSON.Metode umum lainnya dari jenis ini termasuk
File
danPhysicalFile
. 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
, , CreatedAtRoute
dan 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.
ASP.NET Core