Gambaran umum ASP.NET Core MVC

Oleh Steve Smith

ASP.NET Core MVC adalah kerangka kerja yang kaya untuk membangun aplikasi web dan API menggunakan pola desain Model-View-Controller.

Pola MVC

Pola arsitektur Model-View-Controller (MVC) memisahkan aplikasi menjadi tiga grup utama komponen: Model, Tampilan, dan Pengontrol. Pola ini membantu mencapai pemisahan kekhawatiran. Dengan menggunakan pola ini, permintaan pengguna dirutekan ke Pengontrol yang bertanggung jawab untuk bekerja dengan Model untuk melakukan tindakan pengguna dan/atau mengambil hasil kueri. Pengontrol memilih Tampilan untuk ditampilkan kepada pengguna, dan menyediakannya dengan data Model apa pun yang diperlukannya.

Diagram berikut menunjukkan tiga komponen utama dan mana yang mereferensikan yang lain:

MVC Pattern

Delineasi tanggung jawab ini membantu Anda menskalakan aplikasi dalam hal kompleksitas karena lebih mudah untuk membuat kode, men-debug, dan menguji sesuatu (model, tampilan, atau pengontrol) yang memiliki satu pekerjaan. Lebih sulit untuk memperbarui, menguji, dan men-debug kode yang memiliki dependensi yang tersebar di dua atau lebih dari tiga area ini. Misalnya, logika antarmuka pengguna cenderung lebih sering berubah daripada logika bisnis. Jika kode presentasi dan logika bisnis digabungkan dalam satu objek, objek yang berisi logika bisnis harus dimodifikasi setiap kali antarmuka pengguna diubah. Ini sering memperkenalkan kesalahan dan memerlukan pengulangan logika bisnis setelah setiap perubahan antarmuka pengguna minimal.

Catatan

Tampilan dan pengontrol bergantung pada model. Namun, model tidak bergantung pada tampilan maupun pengontrol. Ini adalah salah satu manfaat utama dari pemisahan. Pemisahan ini memungkinkan model dibangun dan diuji independen dari presentasi visual.

Tanggung Jawab Model

Model dalam aplikasi MVC mewakili status aplikasi dan logika atau operasi bisnis apa pun yang harus dilakukan olehnya. Logika bisnis harus dienkapsulasi dalam model, bersama dengan logika implementasi apa pun untuk mempertahankan status aplikasi. Tampilan yang sangat ditik biasanya menggunakan jenis ViewModel yang dirancang untuk berisi data yang akan ditampilkan pada tampilan tersebut. Pengontrol membuat dan mengisi instans ViewModel ini dari model.

Lihat Tanggung Jawab

Tampilan bertanggung jawab untuk menyajikan konten melalui antarmuka pengguna. Mereka menggunakan Razor mesin tampilan untuk menyematkan kode .NET dalam markup HTML. Harus ada logika minimal dalam tampilan, dan logika apa pun di dalamnya harus terkait dengan menyajikan konten. Jika Anda menemukan kebutuhan untuk melakukan banyak logika dalam melihat file untuk menampilkan data dari model kompleks, pertimbangkan untuk menggunakan Komponen Tampilan, ViewModel, atau templat tampilan untuk menyederhanakan tampilan.

Tanggung Jawab Pengontrol

Pengontrol adalah komponen yang menangani interaksi pengguna, bekerja dengan model, dan pada akhirnya memilih tampilan untuk dirender. Dalam aplikasi MVC, tampilan hanya menampilkan informasi; pengontrol menangani dan merespons input dan interaksi pengguna. Dalam pola MVC, pengontrol adalah titik masuk awal, dan bertanggung jawab untuk memilih jenis model mana yang akan dikerjakan dan tampilan mana yang akan dirender (karenanya namanya - ini mengontrol bagaimana aplikasi merespons permintaan tertentu).

Catatan

Pengontrol tidak boleh terlalu rumit oleh terlalu banyak tanggung jawab. Agar logika pengontrol tidak menjadi terlalu kompleks, dorong logika bisnis keluar dari pengontrol dan ke dalam model domain.

Tip

Jika Anda menemukan bahwa tindakan pengontrol Anda sering melakukan jenis tindakan yang sama, pindahkan tindakan umum ini ke dalam filter.

ASP.NET Core MVC

Kerangka kerja ASP.NET Core MVC adalah kerangka kerja presentasi yang ringan, sumber terbuka, dan sangat dapat diuji yang dioptimalkan untuk digunakan dengan ASP.NET Core.

ASP.NET Core MVC menyediakan cara berbasis pola untuk membangun situs web dinamis yang memungkinkan pemisahan kekhawatiran yang bersih. Ini memberi Anda kontrol penuh atas markup, mendukung pengembangan ramah TDD dan menggunakan standar web terbaru.

Perutean

ASP.NET Core MVC dibangun di atas perutean ASP.NET Core, komponen pemetaan URL yang kuat yang memungkinkan Anda membangun aplikasi yang memiliki URL yang dapat dipahami dan dapat dicari. Ini memungkinkan Anda menentukan pola penamaan URL aplikasi yang berfungsi dengan baik untuk pengoptimalan mesin pencari (SEO) dan untuk pembuatan tautan, tanpa memperhatikan bagaimana file di server web Anda diatur. Anda dapat menentukan rute Anda menggunakan sintaks templat rute yang nyaman yang mendukung batasan nilai rute, default, dan nilai opsional.

Perutean berbasis konvensi memungkinkan Anda menentukan format URL yang diterima aplikasi Anda secara global dan bagaimana masing-masing format tersebut memetakan ke metode tindakan tertentu pada pengontrol tertentu. Saat permintaan masuk diterima, mesin perutean mengurai URL dan mencocokkannya dengan salah satu format URL yang ditentukan, lalu memanggil metode tindakan pengontrol terkait.

routes.MapRoute(name: "Default", template: "{controller=Home}/{action=Index}/{id?}");

Perutean atribut memungkinkan Anda menentukan informasi perutean dengan mendekorasi pengontrol dan tindakan Anda dengan atribut yang menentukan rute aplikasi Anda. Ini berarti bahwa definisi rute Anda ditempatkan di samping pengontrol dan tindakan yang terkait dengannya.

[Route("api/[controller]")]
public class ProductsController : Controller
{
    [HttpGet("{id}")]
    public IActionResult GetProduct(int id)
    {
      ...
    }
}

Pengikatan model

ASP.NET pengikatan model Core MVC mengonversi data permintaan klien (nilai formulir, data rute, parameter string kueri, header HTTP) menjadi objek yang dapat ditangani pengontrol. Akibatnya, logika pengontrol Anda tidak perlu melakukan pekerjaan mencari tahu data permintaan masuk; itu hanya memiliki data sebagai parameter untuk metode tindakannya.

public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) { ... }

Validasi model

ASP.NET Core MVC mendukung validasi dengan menghias objek model Anda dengan atribut validasi anotasi data. Atribut validasi diperiksa di sisi klien sebelum nilai diposting ke server, serta di server sebelum tindakan pengontrol dipanggil.

using System.ComponentModel.DataAnnotations;
public class LoginViewModel
{
    [Required]
    [EmailAddress]
    public string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

Tindakan pengontrol:

public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
    if (ModelState.IsValid)
    {
      // work with the model
    }
    // At this point, something failed, redisplay form
    return View(model);
}

Kerangka kerja menangani validasi data permintaan baik di klien maupun di server. Logika validasi yang ditentukan pada jenis model ditambahkan ke tampilan yang dirender sebagai anotasi yang tidak mengganggu dan diberlakukan di browser dengan Validasi jQuery.

Injeksi dependensi

ASP.NET Core memiliki dukungan bawaan untuk injeksi dependensi (DI). Dalam ASP.NET Core MVC, pengontrol dapat meminta layanan yang diperlukan melalui konstruktor mereka, memungkinkan mereka untuk mengikuti Prinsip Dependensi Eksplisit.

Aplikasi Anda juga dapat menggunakan injeksi dependensi dalam file tampilan, menggunakan direktif @inject :

@inject SomeService ServiceName

<!DOCTYPE html>
<html lang="en">
<head>
    <title>@ServiceName.GetTitle</title>
</head>
<body>
    <h1>@ServiceName.GetTitle</h1>
</body>
</html>

Filter

Filter membantu pengembang merangkum masalah lintas pemotongan, seperti penanganan pengecualian atau otorisasi. Filter memungkinkan menjalankan logika pra-dan pasca-pemrosesan kustom untuk metode tindakan, dan dapat dikonfigurasi untuk berjalan pada titik tertentu dalam alur eksekusi untuk permintaan tertentu. Filter dapat diterapkan ke pengontrol atau tindakan sebagai atribut (atau dapat dijalankan secara global). Beberapa filter (seperti Authorize) disertakan dalam kerangka kerja. [Authorize] adalah atribut yang digunakan untuk membuat filter otorisasi MVC.

[Authorize]
public class AccountController : Controller

Area

Area menyediakan cara untuk mempartisi aplikasi Web MVC Core ASP.NET besar ke dalam pengelompokan fungsional yang lebih kecil. Area adalah struktur MVC di dalam aplikasi. Dalam proyek MVC, komponen logis seperti Model, Pengontrol, dan Tampilan disimpan di folder yang berbeda, dan MVC menggunakan konvensi penamaan untuk membuat hubungan antara komponen-komponen ini. Untuk aplikasi besar, mungkin menguntungkan untuk mempartisi aplikasi ke dalam area fungsionalitas tingkat tinggi yang terpisah. Misalnya, aplikasi e-niaga dengan beberapa unit bisnis, seperti pembayaran, penagihan, dan pencarian, dll. Masing-masing unit ini memiliki tampilan komponen logis, pengontrol, dan modelnya sendiri.

Web API

Selain menjadi platform yang bagus untuk membangun situs web, ASP.NET Core MVC memiliki dukungan besar untuk membangun API Web. Anda dapat membangun layanan yang menjangkau berbagai klien termasuk browser dan perangkat seluler.

Kerangka kerja ini mencakup dukungan untuk negosiasi konten HTTP dengan dukungan bawaan untuk memformat data sebagai JSON atau XML. Tulis formatter kustom untuk menambahkan dukungan untuk format Anda sendiri.

Gunakan pembuatan tautan untuk mengaktifkan dukungan untuk hypermedia. Aktifkan dukungan dengan mudah untuk Berbagi Sumber Daya Lintas Asal (CORS) sehingga API Web Anda dapat dibagikan di beberapa aplikasi Web.

Testabilitas

Penggunaan antarmuka kerangka kerja dan injeksi dependensi membuatnya sangat cocok untuk pengujian unit, dan kerangka kerja mencakup fitur (seperti penyedia TestHost dan InMemory untuk Kerangka Kerja Entitas) yang membuat pengujian integrasi cepat dan mudah juga. Pelajari selengkapnya tentang cara menguji logika pengontrol.

Razor mesin tampilan

ASP.NET tampilan Core MVC menggunakan Razor mesin tampilan untuk merender tampilan. Razor adalah bahasa markup templat yang ringkas, ekspresif, dan cairan untuk menentukan tampilan menggunakan kode C# yang disematkan. Razor digunakan untuk menghasilkan konten web secara dinamis di server. Anda dapat mencampur kode server dengan bersih dengan konten dan kode sisi klien.

<ul>
    @for (int i = 0; i < 5; i++) {
        <li>List item @i</li>
    }
</ul>

Razor Menggunakan mesin tampilan, Anda dapat menentukan tata letak, tampilan parsial, dan bagian yang dapat diganti.

Tampilan yang sangat ditik

Razor tampilan dalam MVC dapat ditik dengan kuat berdasarkan model Anda. Pengontrol dapat meneruskan model yang diketik dengan kuat untuk tampilan yang memungkinkan tampilan Anda memiliki pemeriksaan jenis dan dukungan IntelliSense.

Misalnya, tampilan berikut merender model jenis IEnumerable<Product>:

@model IEnumerable<Product>
<ul>
    @foreach (Product p in Model)
    {
        <li>@p.Name</li>
    }
</ul>

Tag Helper

Pembantu Tag memungkinkan kode sisi server untuk berpartisipasi dalam membuat dan merender elemen HTML dalam Razor file. Anda dapat menggunakan pembantu tag untuk menentukan tag kustom (misalnya, <environment>) atau untuk memodifikasi perilaku tag yang ada (misalnya, <label>). Tag Helpers mengikat elemen tertentu berdasarkan nama elemen dan atributnya. Mereka memberikan manfaat penyajian sisi server sambil tetap mempertahankan pengalaman pengeditan HTML.

Ada banyak Pembantu Tag bawaan untuk tugas umum - seperti membuat formulir, tautan, memuat aset, dan banyak lagi - dan bahkan lebih tersedia di repositori GitHub publik dan sebagai paket NuGet. Pembantu Tag ditulis dalam C#, dan mereka menargetkan elemen HTML berdasarkan nama elemen, nama atribut, atau tag induk. Misalnya, LinkTagHelper bawaan dapat digunakan untuk membuat tautan ke Login tindakan AccountsController:

<p>
    Thank you for confirming your email.
    Please <a asp-controller="Account" asp-action="Login">Click here to Log in</a>.
</p>

EnvironmentTagHelper dapat digunakan untuk menyertakan skrip yang berbeda dalam tampilan Anda (misalnya, mentah atau dikurangi) berdasarkan lingkungan runtime, seperti Pengembangan, Penahapan, atau Produksi:

<environment names="Development">
    <script src="~/lib/jquery/dist/jquery.js"></script>
</environment>
<environment names="Staging,Production">
    <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.1.4.js"
            asp-fallback-src="~/lib/jquery/dist/jquery.js"
            asp-fallback-test="window.jQuery">
    </script>
</environment>

Pembantu Tag memberikan pengalaman pengembangan ramah HTML dan lingkungan IntelliSense yang kaya untuk membuat HTML dan Razor markup. Sebagian besar Pembantu Tag bawaan menargetkan elemen HTML yang ada dan menyediakan atribut sisi server untuk elemen tersebut.

Lihat Komponen

Komponen Tampilan memungkinkan Anda mengemas logika penyajian dan menggunakannya kembali di seluruh aplikasi. Tampilan tersebut mirip dengan tampilan parsial, tetapi dengan logika terkait.

Versi kompatibilitas

Metode ini SetCompatibilityVersion memungkinkan aplikasi untuk ikut serta atau menolak perubahan perilaku yang berpotensi melanggar yang diperkenalkan dalam ASP.NET Core MVC 2.1 atau yang lebih baru.

Untuk informasi selengkapnya, lihat Versi kompatibilitas untuk ASP.NET Core MVC.

Sumber Daya Tambahan: