Recent Posts

ASP.Net MVC : Controller Part 1

Dalam bab ini Anda akan melihat bahwa dalam dunia pola MVC, Controller memproses permintaan HTTP masuk dari pengguna. Setiap permintaan HTTP ditangani oleh pengontrol tertentu. ASP.NET MVC menerapkan konsep Controller dengan .NET kelas yang memiliki metode untuk memproses permintaan tersebut. Metode dalam controller disebut action methods karena mereka mengembalikan objek tipe ActionResult.

Proses permintaan dimulai dengan elemen yang disebut routing engine, yang memetakan permintaan ke pengontrol dan sebuah metode (bab ini hanya memberikan pengantar singkat tentang perutean). Setelah Itu, metode dijalankan dan menghasilkan objek hasil tindakan yang dikembalikan ke pengguna. Jenis yang paling umum objek hasil tindakan adalah  tampilan yang membuat HTML di browser.

Kita akan membuat controller bernama PetController dengan fungsionalitas utama untuk aplikasi web HaveYouSeenMe. Kontroler ini, dan fungsionalitas yang diterapkan di dalamnya melalui bab ini, akan digunakan untuk mendemonstrasikannya cara kerja dengan pengendali dan metode  tindakan.

The Routing Engine (Mesin Perutean)

Template aplikasi Internet ASP.NET MVC 4 di Visual Studio mencakup dua rute default sehingga proyek akan berlari. Listing 4-1 menunjukkan rute default. Rute pertama menginstruksikan mesin routing untuk mengabaikan permintaan untuk .axd sumber daya seperti ScriptResource.axd dan WebResource.axd. Sumber daya ini tidak secara fisik ada sebagai file dalam aplikasi; Sebaliknya, mereka adalah HttpModules yang memuat konten khusus (seperti gambar, skrip, CSS, dll.)

tertanam dalam file DLL sehingga bisa dikirim ke browser sebagai bagian dari respon. Rute kedua digunakan untuk memetakan permintaan untuk pengendali dan metode tindakan.

Listing 4-1. Rute Default Dibuat dalam Aplikasi Internet Template dalam Visual Studio

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
     name: "Default",
     url: "{controller}/{action}/{id}",
     defaults: new { controller = "Home",
                     action = "Index",
                     id = UrlParameter.Optional }
);

Agar bekerja dengan benar, rute harus dibuat saat aplikasi dimulai. Ada handler yang disebut Application_Start dalam file Global.asax.cs untuk tujuan ini. Di ASP.NET MVC 4, event Application_Start handler memanggil metode statis RegisterRoutes() di kelas RouteConfig yang terletak di folder App_Start. Metode tersebut menerima tabel rute yang ada sebagai parameter sehingga rute dapat ditambahkan ke dalamnya.

Definisi rute dilakukan dengan metode ekstensi MapRoute di kelas RouteCollection. Rute definisi berisi nama rute sebagai parameter pertama, pola rute sebagai parameter kedua, dan default nilai untuk elemen dalam pola rute sebagai parameter ketiga. Pola rute di rute default disusun dari tiga placeholder Setiap placeholder didefinisikan menggunakan kurung kurawal, {}.

Sistem perutean sebenarnya tidak tahu tentang pengendali dan metode mereka; itu hanya cocok dengan permintaan sebuah pola dalam rute yang ditentukan (jika ada) dan meneruskan informasi ke pipa permintaan, yang kemudian akan dijalankan metode di controller.

Pola rute mengidentifikasi nama pengontrol dengan properti placeholder pengendali, placeholder tindakan properti mendefinisikan metode tindakan di kelas pengontrol yang akan dijalankan, dan parameter ketiga tambahan menunjukkan beberapa jenis informasi yang akan digunakan oleh metode tersebut. Perhatikan bahwa permintaan HTTP tidak termasuk kata "Controller" meskipun kelas kontroler (sesuai konvensi penamaan) menggunakannya. Misalnya dengan HTTP permintaan http://myapp/Home/About, peta rute ke kelas HomeController dan metode tindakan About.

Catatan :
Ketika mesin routing pertama kali diluncurkan, itu adalah bagian dari ASP.NET MVC, namun karena keberhasilannya, itu kemudian pindah dari kerangka ASP.NET MVC dan dipanggang ke dalam framework inti ASP.NET, sehingga membuatnya tersedia juga ke Formulir Web dan Halaman Web.

Metode tindakan di kelas pengendali dapat memiliki parameter. Parameter ini disesuaikan dengan nilai pada permintaan. Misalnya, permintaan seperti http://myapp/Product/Details?Id=1 dipetakan ke ProductController kelas untuk mengeksekusi metode Details action, dan metode action menerima parameter bernama id yang akan diisi dengan nilai dari permintaan Parameter default memberi nilai default bagi placeholder dalam pola URL-ini memungkinkan pengguna banyak fleksibilitas dalam cara mereka menentukan URL di browser. Tabel 4-1 mencantumkan beberapa contoh URL yang mungkin dimiliki pengguna ketik di browser, dan bagaimana mereka akan dicocokkan dengan mesin routing menggunakan rute default.
 

Tabel 4-1. Contoh Bagaimana Rute Default URL Maps Meminta Metode Tindakan Pengontrol

RequestParameter ValuesExecution
http://domain/controller = Home
action = Index
The Index method in the HomeController class
http://domain/Petcontroller = Pet
action = Index
The Index method in the PetController class
http://domain/Pet/Detailscontroller = Pet
action = Details
The Details method in the PetController class
http://domain/Pet/Details/1controller = Pet
action = Details
id = 1
The Details action method in the PetController class passes the value 1 as the Id parameter of the action method


Meskipun sangat umum untuk menentukan nilai default untuk properti placeholder dalam rute, namun tidak diperlukan. Jika Anda tidak menambahkan nilai default ke rute, permintaan HTTP harus menyediakan nilai untuk semua placeholder sehingga rute bisa disesuaikan dengan permintaan.

Mari kita bayangkan misalnya bahwa rute kita dari Listing 4-1 tidak memiliki nilai default. Ini akan terlihat seperti yang ditunjukkan pada Listing 4-2. Jika sekarang kita mencoba  menggunakan contoh permintaan yang sama dari Tabel 4-1, kita akan melihat jawabannya
dari Tabel 4-2.

Listing 4-2. Definisi Rute Tanpa Nilai Default untuk Placeholder

routes.IgnoreRoute ("{resource} .axd / {* pathInfo}");
routes.MapRoute (
      name: "Default",
      url: "{controller} / {action} / {id}"
);


Tabel 4-2. Contoh Permintaan dengan Rute Default Tapi Tidak ada Nilai Default

RequestParameter ValuesExecution
http://domain/
Kesalahan. URL tidak termasuk nilai untuk kontroler, tindakan, atau id.
http://domain/Pet
Error. The URL doesn’t include values for action or id.
http://domain/Pet/Details
Error. The URL doesn’t include values for id.
http://domain/Pet/Details/1controller = Pet
action = Details
id = 1
The Details action method in the PetController class passes the value 1 as the Id parameter of the action method

Membuat Controller

Saat membuat kontroler di ASP.NET MVC, nama kelas pengontrol memiliki bentuk <ControllerName> Controller. Misalnya, Listing 4-3 menunjukkan kerangka kelas PetController di file PetController.cs. Pengontrol nama sebenarnya Pet, tapi perilaku default dari mesin routing adalah dengan menggunakan kelas yang akan memiliki nama yang berakhir dengan kata Controller. Perilaku ini bisa dimodifikasi, tapi topik itu di luar ruang lingkup buku ini. Kelas mewarisi dari kelas dasar Pengendali (di namespace System.Web.Mvc).

Listing 4-3. Definisi Kelas Pengawas Pet


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;


namespace HaveYouSeenMe.Controllers
{
    public class PetController : Controller
    {


    }
}


Kelas dasar Controller memberi kelas Anda fungsionalitas untuk menangani permintaan dan kemampuan untuk membuatnya metode tindakan, yang, seperti yang dijelaskan di awal bab ini, hanyalah metode reguler yang kembali sebuah objek ActionResult. Ada berbagai jenis objek ActionResult seperti tampilan, file, pengalihan ke rute lain, dan sebagainya. Secara teknis, sebuah objek ActionResult mewakili sebuah perintah yang akan dibuat  kerangka kerja lakukan atas nama tindakan yang diminta oleh pengguna. Kelas ActionResult adalah kelas dasar untuk semua hal yang spesifik implementasi hasil tindakan. Kelas berikut berasal dari kelas ActionResult dan dapat digunakan sebagai sebuah tipe pengembalian metode tindakan:

  • ViewResult: Digunakan untuk mengembalikan tampilan untuk membuat HTML di browser. Ini adalah yang paling umum ActionResult.
  • PartialViewResult: Serupa dengan ViewResult, ia mengembalikan sebagian tampilan.
  • ContentResult: Digunakan untuk mengembalikan semua jenis konten. Secara default, digunakan untuk mengembalikan teks biasa, namun jenis konten sebenarnya dapat didefinisikan secara eksplisit (misalnya teks / xml).
  • EmptyResult: Ini setara dengan metode void - ini adalah definisi hasil tindakan objek, tapi tidak ada apa-apanya.
  • FileResult: Digunakan untuk mengembalikan konten biner (mis., Jika Anda ingin mendownload file).
  • HttpUnauthorizedResult: Anda dapat mengembalikan objek HttpUnauthorizedResult saat permintaan mencoba mengakses konten terbatas yang, misalnya, tidak tersedia untuk anonim pengguna. Browser kemudian dialihkan ke halaman login.
  • JavaScriptResult: Digunakan untuk mengembalikan kode JavaScript.
  • JsonResult: Digunakan untuk mengembalikan sebuah objek dalam format JavaScript Object Notation (JSON).
  • RedirectResult: Digunakan untuk melakukan redirect HTTP ke URL lain. Anda bisa mendefinisikannya sebagai pengalihan HTTP sementara (kode 302) atau permanen (kode 301).
  • RedirectToRouteResult: digunakan untuk melakukan redirect HTTP, tapi ke rute tertentu dari URL

Bekerja dengan Action Methods

Contoh pada Listing 4-4 ​​menunjukkan metode tindakan pada pengontrol Pet kami. Meskipun tipe pengembalian yang dinyatakan Metodenya adalah ActionResult, sebenarnya kami mengembalikan objek ViewResult yang mewakili sebuah tampilan. Kelas ViewResult mewarisi dari ActionResult, jadi kerangka itu akan menerimanya.

Listing 4-4. Tampilan Action Methods di Kelas PetController


public ActionResult Display()
{
     var name = (string)RouteData.Values["id"];
     var model = PetManagement.GetByName(name);


     if (model == null)
         return RedirectToAction("NotFound");
         return View(model);
}


public ActionResult NotFound()
{
     return View();
}



Bila permintaan dari pengguna seperti http: // domain / Pet / Display / Fido dibuat ke aplikasi, perutean Mesin mencocokkannya dengan metode tindakan Display di kelas PetController. Selanjutnya, metode tindakan memeriksa Kamus RouteData untuk mencari nilai di placeholder {id}, yaitu Fido. Setelah nama hewan peliharaan itu Diidentifikasi, metode aksi menggunakan kelas model bisnis bernama PetManagement untuk mengambil sebuah record dari database (jika ada) dan letakkan di variabel model. (Model bisnis diperiksa pada Bab 6.)

Metode PetManagement.GetByName () akan mengembalikan objek jika ada catatan hewan peliharaan; Jika tidak maka akan kembali batal. Jika nilai yang dikembalikan adalah null, maka metode tindakan mengalihkan ke metode tindakan lain yang disebut NotFound. Ini Metode action akan mengembalikan tampilan dengan fungsionalitas tertentu untuk  menginformasikan pengguna bahwa tidak ada hewan peliharaan dengan nama Fido dalam sistem.

Jika sebuah rekaman ditemukan untuk Fido, maka sebuah pandangan akan dikembalikan bersamaan dengan catatan yang baru ditemukan sehingga bisa dilihat membuat rincian hewan peliharaan Menggunakan FileResult Mari sekarang menambahkan fungsionalitas untuk memungkinkan pengguna mengunduh gambar hewan peliharaan. Pada Listing 4-5, metode tindakan DownloadPetPicture mengembalikan objek FileResult. Isi dari objek FileResult adalah file gambar hewan peliharaan, yang mana ada di folder Content / Uploads.

Listing 4-5. Download File Menggunakan FileResult


public FileResult DownloadPetPicture()
{
     var name = (string)RouteData.Values["id"];
     var picture = "/Content/Uploads/" + name + ".jpg";
     var contentType = "image/jpg";
     var fileName = name + ".jpg";
     return File(picture, contentType, fileName);
}


Objek FileResult mengharapkan tiga parameter: jalur tempat file berada, jenis konten gambar / jpg (karena kita menggunakan gambar dan menganggapnya file JPG), dan nama filenya, karena kita ingin menampilkannya pengguna saat mereka diminta untuk mendownload. Gambar 4-1 menunjukkan hasilnya di browser.



Gambar 4-1. Mengunduh file dengan FileResult Action Methods

bersambung....

Tidak ada komentar:

Posting Komentar