Latar Belakang
Artikel
ini akan memberikan pemahaman tentang konsep dasar hingga lanjutan dari
ActionResult di ASP NET MVC. Ketika, Agung Panduan akan membuat bahan materi
pelatihan, saya bertanya-tanya "Mengapa disana ada data tipe ContentResult
dalam Method Action dan apa tujuannya?" atau “Return Values apa saja yang
dapat diperoleh?”
Topik
yang dibahas dari Apa
itu ActionResult?
- Content Returning Results
- Redirection Results
- Status Results
Bagian pertama dari pertanyaan adalah
"Mengapa ada tipe data ContentResult dalam method Action?". Untuk
memahami ini, anda harus memahami tipe data dalam ASP NET MVC karena
ContentResult adalah tipe data yang tipe dasarnya adalah ActionResult yang
dalam artian bahwa ContentResult merupakan tipe data bentukan dari tipe
ActionResult. Untuk lebih jelasnya mari kita sama-sama memahami konsep Action
Result.
Mari kita mulai dengan Action Result
ActionResult
ActionResult sebetulnya merupakan tipe data. Ketika digunakan dengan metode Action, ActionResult dipanggil menjadi Return Type. Seperti yang anda ketahui, Action adalah sebuah metode dari controller, Action Result adalah hasil dari Action setelah di execute(dijalankan). Dalam faktanya, Action Result adalah Return Type. Tipe Return memiliki banyak turunan lainnnya. Pertama, kita lihat tipe dasar dan tipe turunannya dari Action Result.
using System;
namespace System.Web.Mvc
{
public abstract class ActionResult
{
// Summary:
// Initializes a new instance of the System.Web.Mvc.ActionResult class.
protected ActionResult();
// Summary:
// Enables processing of the result of an action method by a custom type that
// inherits from the System.Web.Mvc.ActionResult class.
//
// Parameters:
// context:
// The context in which the result is executed. The context information includes
// the controller, HTTP content, request context, and route data.
public abstract void ExecuteResult(ControllerContext context);
}
}
Seperti
yang kita lihat di Visual Studio, Action Result berasal dari System.Web.Mvc. Namun
untuk melihat isi keseluruhan dari System.Web.Mvc anda harus menggunakan
beberapa aplikasi seperti ILSpy.
Cara
Menggunakan ILSpy untuk melihat Assembly di Visual Studion
- Download terlebih dahulu IlSpy dan Extract
- Jalankan ILSpy
- Open dan Browser lokasi file System.Web.Mvc.dll pada folder bin project ASP NET MVC yang anda buat.
Seperti
yang diperlihatkan pada gambar di atas ActionResult merupakan Base Type yang
dapat mengembalikan nilai Derived Type seperti HttpStatusCodeResult, JavaScriptResult,
FileResult, ContentResult, JsonResult, EmptyResult, RedirectResult,
RedirectToRouteResult, ViewResult namun untuk mengembalikan Derived types
tersebut dibutuhkan Method Helper ActionResult.
Ketika kita masuk ke ActionResult, Action Result adalah abstract class karena Action dari Controller dapat mengembalikan nilai berbagai jenis tipe data pada saat yang sama.
public ActionResult Index()
{
bool answer = DateTime.Now.Day + 2 == 5;
if (answer)
{
return Content("AgungPanduan.com");
}
else
{
return View();
}
}
Seperti
yang anda lihat, pada method Index() dapat mengembalikan 2 tipe yang berbeda
yaitu Content dan View. Jika Anda ingin mengembalikan beberapa tipe, Anda harus
menggunakan base type seperti ActionResult.
Konsep
di atas juga menjawab pertanyaan "Kapan memilih Base Type ActionResult
atau derived type?"
Tiga
Kategori dari derived type
Ada konsep penting dari Derived Type yang perlu anda pahami,
Content Returning Results
Seperti
yang ada di gambar di atas menerangkan bahwa ada 7 konten yang memberikan
hasil:
A. ViewResult
ViewResult adalah tipe data yang bertanggung jawab untuk mengambalikan value berupa tampilan (view) ke browser. Mari kita lihat contohnya.
namespace UserLoginSQLCommand.Controllers
{
public class HomeController : Controller
{
//[Authorize]
public ActionResult Index()
{
return View();
}
}
}
Method ActionResult akan mengembalikan value berupa tampilan View
yang bernama index.cshtml pada folder Views > Home (nama folder harus sama
dengan nama depan di class controller).
<h2>
This is Index View dari AgungPanduan.com.
</h2>
Seperti yang Anda lihat dalam kode di atas, metode Action Index() mengembalikan tampilan menggunakan tipe ViewResult. Setelah ini, MVC akan menemukan View memiliki nama "Index" dari folder "Home" di folder Views. Dan hasilnya adalah sebagai berikut,
Hal yang menarik dengan tipe ViewResult adalah, Anda dapat mengembalikan tampilan yang berbeda terlepas dari menggunakan tampilan yang memiliki nama yang sama dengan metode tindakan. Lihatlah sebuah contoh.
namespace CreateMenuAddBootstrap.Controllers
{
public class HomeController : Controller
{
//public ActionResult Index()
//{
// return View("View AgungPanduan");
//}
public ViewResult Index() {
return View("View AgungPanduan");
}
}
}
Anda dapat melihat gambar di bawah ini bahwa halaman "View AgungPanduan" ada di folder Home dengan nama yang sama yang ditulis pada return view.
Data script kode pada View AgungPanduan.cshtml adalah
@{
ViewBag.Title = "View AgungPanduan";
}
<h2>Ini adalah tampilan AgungPanduan.com yang kedua</h2>
Anda dapat melihat di atas, sekarang MVC akan menemukan view yang memiliki nama " View AgungPanduan " daripada menemukan View yang memiliki nama yang sama dengan nama Action. Output adalah sebagai berikut,
Oleh
karena itu, Anda dapat memanggil view lain dengan menggunakan nama Action yang
berbeda dengan bantuan tipe ViewResult.
B. PartialViewResult
Ini
adalah jenis tipe yang digunakan untuk mengembalikan value berupa tampilan
partial. Jika anda menggunakan ini pada Method. Mari kita bandingkan beberapa
metode ActionResult dan PartialViewResult.
Pertama, kita buat script Method PartialViewResult di dalam HomeController,
namespace CreateMenuAddBootstrap.Controllers
{
public class HomeController : Controller
{
//public ActionResult Index()
//{
// return View("");
//}
//public ViewResult Index() {
// return View("View AgungPanduan");
//}
public PartialViewResult Index()
{
return PartialView("_View AgungPanduan");
}
}
}
Kedua, Kita gunakan _View AgungPanduan.cshtml tetap disimpan di folder View > Home.
Jika lakukan Debug maka hasilnya hanya sebuah tampilan text tanpa menampilkan dari script pada _Layout.cshtml.
Sekarang,
bagaimana dengan penggunaan ActionResult untuk mengembalikan value tipe
PartialView.
Pertama, kita buat nama controller baru dengan nama “AgungPanduanController” dan Metode ActionResult dengan nama “Name”.
namespace CreateMenuAddBootstrap.Controllers
{
public class AgungPanduanController : Controller
{
//
// GET: /AgungPanduan/
//public ActionResult Index()
//{
// return View();
//}
public ActionResult Name()
{
return View("_View AgungPanduan");
}
}
}
Kedua,
Tidak perlu membuat View dengan nama "Name". Karena di sini Method Action Name memanggil halaman View yang berbeda. Lihat struktur folder di
bawah ini,
Cara terbaik untuk memberikan penamaan file cshtml adalah dengan menambahkan tanda “_” di depan dan simpan pada folder AgungPanduan atau folder Shared. Untuk dapat melihat tampilan pada file _View AgungPanduan.cshtml yang ada di folder AgungPanduan anda harus mengetikan Url (http://localhost:50728/AgungPanduan/Name).
Jelas
terlihat perbedaan penggunaan PartialViewResult dengan ActionResult, yaitu
PartialViewResult tidak dapat menampilkan script view yang ada di file _Layout.cshtml
sedangkan ActionResult bisa menampilkannya.
C. ContentResult
"Content" adalah tipe data yang bertanggung jawab untuk mengembalikan value content. Tetapi yang menarik adalah, Anda akan memiliki kontrol yang tepat atas konten yang dikembalikan. Maksud saya mengatakan bahwa Anda harus menambahkan script (html, script, dll.) dalam Return Type “Content” dengan bantuan Metode ContentResult.
namespace CreateMenuAddBootstrap.Controllers
{
public class AgungPanduanController : Controller
{
//
// GET: /AgungPanduan/
//public ActionResult Index()
//{
// return View();
//}
public ActionResult Name()
{
return View("_View AgungPanduan");
}
public ContentResult TestContent()
{
return Content("<h3>Agung Panduan</h3>", "text/html");
}
}
}
Dan output yang dihasilkan adalah sebagai berikut:
Seperti yang dijelaskan sebelumnya ContentResult dapat mengembalikan value content berupa <script> seperti yang ditunjukkan di bawah ini,
namespace CreateMenuAddBootstrap.Controllers
{
public class AgungPanduanController : Controller
{
//
// GET: /AgungPanduan/
//public ActionResult Index()
//{
// return View();
//}
public ActionResult Name()
{
return View("_View AgungPanduan");
}
public ContentResult TestContentScript()
{
return Content("<script> alert('Hi! Agung Panduan') </script>");
}
}
}
Dan output yang dihasilkan adalah sebagai berikut:
D. EmptyResult
Jenis ini benar-benar tidak mengembalikan apa-apa. Tetapi masalahnya adalah, tipe EmptyResult ini tidak memiliki metode helper. Jadi kita bisa menggunakannya dengan membuat objeknya, seperti yang ditunjukkan di bawah ini,
namespace CreateMenuAddBootstrap.Controllers
{
public class AgungPanduanController : Controller
{
public EmptyResult TestEmptyResult()
{
return new EmptyResult();
}
}
}
Anda pun dapat menggunakan ActionResult namun kode yang digunakan seperti di bawah ini,
namespace CreateMenuAddBootstrap.Controllers
{
public class AgungPanduanController : Controller
{
public ActionResult TestEmptyResult()
{
return null;
}
}
}
E. FileResult
FileResult adalah tipe yang digunakan untuk mengembalikan file ke browser. Metode helper untuk tipe ini adalah FileResult, dan memiliki banyak kelebihan. Jadi jika kita menggunakan overload berikut dan hanya menentukan URL file dan tipe MIME (Multipurpose Internet Mail Extensions) maka kita seharusnya dapat melihat konten file di browser. Mari kita ambil contoh.
namespace CreateMenuAddBootstrap.Controllers
{
public class AgungPanduanController : Controller
{
public FileResult TestResultType()
{
return File("~/Files/text.txt", "text/plain");
}
}
}
Namun untuk menjalankan method FileResult tersebut anda harus menyimpan file pada folder baru dengan nama “Files” di Project anda seperti yang ditunjukkan struktur folder di bawah ini,
Dan output yang dihasilkan adalah sebagai berikut:
Sekarang jika Anda ingin mengembalikan file dalam byte array maka Anda harus menggunakan kode berikut,
namespace CreateMenuAddBootstrap.Controllers
{
public class AgungPanduanController : Controller
{
public FileResult TestResultTypeArray ()
{
byte[] fileBytes = System.IO.File.ReadAllBytes(Server.MapPath("~/Files/text.txt"));
return File(fileBytes, "text/plain"); }
}
}
Sekarang
jika Anda tidak ingin menampilkan file di browser dan ingin file Anda dapat di
download maka Anda harus menggunakan metode helper yang overload berikut ini,
protected internal virtual FilePathResult File(string fileName, string contentType, string fileDownloadName);
Kode Action menggunakan FileResult diberikan di bawah ini,
namespace CreateMenuAddBootstrap.Controllers
{
public class AgungPanduanController : Controller
{
public FileResult TestResultTypeArray ()
{
return File(Url.Content("~/Files/text.txt"), "text/plain", "testFile.txt");
}
}
}
F. JsonResult
Ini adalah deriverd type dari ActionResult yang digunakan untuk mewakili data JSON. Untuk melihat bagaimana kami dapat JSON notifikasi data apa pun, Anda dapat melihat kode di bawah ini:
namespace CreateMenuAddBootstrap.Controllers
{
public class AgungPanduanController : Controller
{
public JsonResult Index()
{
return Json(new { Name = "Agung Panduan", ID = 1 });
}
}
}
Dan hasil outputnya adalah sebagai berikut,
Anda
akan mendapatkan pesan error ini setelah mengeksekusi kode di atas. Sekarang
mengerti apa masalahnya di sini.
Seperti
yang anda ketahui, MVC menghentikan pembagian informasi melalui permintaan GET dengan
tujuan agar Pembajakan Data JSON tidak terjadi. Mengapa hal ini dilakukan karena
JSON memiliki data penting yang harus di jaga keamanannya.
Namun jika Anda ingin berbagi informasi melalui permintaan GET maka Anda harus menggunakan kode yang ditunjukkan di bawah ini,
namespace CreateMenuAddBootstrap.Controllers
{
public class AgungPanduanController : Controller
{
public JsonResult Index()
{
return Json(new { Name = "Agung Panduan", ID = 1 }, JsonRequestBehavior.AllowGet);
}
}
}
Dan hasil outputnya menjadi (Menggunakan Browser Firefox)
Jadi,
JsonRequestBehavior.AllowGet mengizinkan MVC untuk berbagi informasi melalui
permintaan GET. Tetapi Anda harus menggunakan fitur di atas ketika Anda yakin
bahwa data JSON Anda tidak mengandung data sensitif.
Catatan tambahan: (new { Name = "Agung Panduan", ID = 1 }, JsonRequestBehavior.AllowGet) dapat digantikan dengan nama class yang berisi model-model. Misalkan menjadi,
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace CreateMenuAddBootstrap.Models
{
public class AgungPanduan
{
public string Name { get; set; }
public int Id { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using CreateMenuAddBootstrap.Models;
namespace CreateMenuAddBootstrap.Controllers
{
public JsonResult Index()
{
AgungPanduan informasi = new AgungPanduan();
//return Json(new { Name = "Agung Panduan", ID = 1 });
//return Json(new { Name = "Agung Panduan", ID = 1 }, JsonRequestBehavior.AllowGet);
informasi.Name = "Agung Kasep";
informasi.Id=1;
return Json(informasi, JsonRequestBehavior.AllowGet);
}
}
Dan hasil outputnya menjadi (Menggunakan Browser Firefox)
G. JavaScriptResult
Jenis deriverd type ini digunakan untuk mengembalikan kode javascript dari controller. Ketika dijalankan, kita melihat kode javascript seperti yang kita sebutkan dalam metode tindakan pengontrol. Untuk detailnya, mari kita ambil contoh,
namespace CreateMenuAddBootstrap.Controllers
{
public JavaScriptResult TestJavascript()
{
return JavaScript("alert('AgungPanduan.com')");
}
}
Dan file
view Index.cshtml mengandung kode script di bawah ini,
<script type="text/javascript" src="@Url.Action("TestJavascript")"></script>
Dan
hasil outputnya menjadi (Menggunakan Browser Firefox);
Redirection Results
Jenis
ActionResult ini digunakan untuk tujuan pengalihan halaman web, yang akan Anda
lihat dengan contoh di sini. Ada 2 jenis hasil pengalihan,
A. RedirectionResult
Jika Anda menggunakan jenis ini maka itu akan mengarahkan ke URL yang Anda tentukan. Contoh diberikan di bawah ini,
namespace CreateMenuAddBootstrap.Controllers
{
public RedirectResult TestRedirect()
{
return Redirect("https://www.agungpanduan.com/p/about.html");
}
}
Dalam
output, URL yang ditentukan akan terbuka, seperti yang ditunjukkan di bawah
ini,
RedirectionResult lebih baik digunakan untuk pengalihan ke URL yang masih aktif
yang berarti itu bukan cara yang terbaik untuk melakukan pengalihan ke halaman
lokal aplikasi saat ini. Untuk tujuan ini gunakan RedirectionToRouteResult
seperti yang dijelaskan di bawah ini,
B. RedirectionToRouteResult
RedirectionToRouteResult
berfungsi sebagai Action pengalihan pada controller dalam aplikasi. Maksudnya RedirectionToRouteResult
akan mengalihkan dari satu controller ke controller lain. Dalam metode
helpernya memiliki banyak metode yang sebenarnya overload. Mari kita lihat
contohnya,
Kita buat controller baru dengan nama TestRedirectionController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace CreateMenuAddBootstrap.Controllers
{
public class TestRedirectionController : Controller
{
//
// GET: /TestRedirection/
public RedirectToRouteResult Index()
{
return RedirectToRoute(new { controller = "AgungPanduan", action = "Name" });
}
}
}
Sekarang
jalankan Metode Action RedirectToRouteResult dengan
mengetikan url pada browser (http://localhost:50728/TestRedirection)
maka halaman web akan menuju halaman yang di tampilkan oleh AgungPanduanController.cs.
Seperti
yang Anda lihat, metode helper RedirectToRoute digunakan untuk memanggil
Action dalam controller saat ini sehingga jika MVC tidak menemukan pesan error
404. RedirectToRoute memiliki banyak kelebihan, Anda dapat memberikan pengontrol,
aksi, nilai rute, dan banyak lagi. Jadi, Anda harus menggunakan sesuai dengan
skenario Anda.
Status Result
Tanggung
jawabnya adalah memberikan kode status ke browser. Ada tiga jenis himpunan ini
dijelaskan di bawah,
A. HttpStatusCodeResult
Jenis ini digunakan untuk memberikan kode status HTTP ke browser. Lihatlah contohnya.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Net;
namespace CreateMenuAddBootstrap.Controllers
{
public class TestRedirectionController : Controller
{
//
// GET: /TestRedirection/
public HttpStatusCodeResult TestHttpStatus()
{
return new HttpStatusCodeResult(HttpStatusCode.Unauthorized);
}
}
}
Dan hasil outputnya menjadi (Menggunakan Browser Firefox)
Anda pun dapat menambahkan pesan yang anda inginkan setelah menggunakan versi HttpStatusCodeResult menjadi seperti di bawah ini,
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Net;
namespace CreateMenuAddBootstrap.Controllers
{
public class TestRedirectionController : Controller
{
//
// GET: /TestRedirection/
public HttpStatusCodeResult TestHttpStatus2()
{
return new HttpStatusCodeResult(HttpStatusCode.Unauthorized, "Sorry! You don't have access.");
}
}
}
Dan hasil outputnya menjadi (Menggunakan Browser Firefox)
Di
sini HttpStatusCode datang dari namespace System.Net. Dan itu berisi semua kode
status HTTP.
B. HttpUnauthorizedResult
Jika Anda tidak ingin menggunakan namespace System.Net maka HttpStatusCodeResult memiliki overload yang hasilnya akan sama seperti di atas. Lihat kode di bawah ini:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Net;
namespace CreateMenuAddBootstrap.Controllers
{
public class TestRedirectionController : Controller
{
//
// GET: /TestRedirection/
public HttpStatusCodeResult TestHttpStatus3()
{
return new HttpUnauthorizedResult("Sorry! You don't have access.");
}
}
}
Outputnya
sama seperti pada HttpStatusCodeResult tetapi kodenya terlihat lebih mudah
dibaca.
C. HttpNotFoundResult
Ini juga kelebihan HttpStatusCodeResult tetapi memiliki metode helper, saya tidak harus membuat objek anonim. Kode tersebut adalah sebagai berikut:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Net;
namespace CreateMenuAddBootstrap.Controllers
{
public class TestRedirectionController : Controller
{
//
// GET: /TestRedirection/
public HttpNotFoundResult TestHttpStatus4()
{
return HttpNotFound("Sorry! You don't have access.");
}
}
}
Dan hasil outputnya menjadi (Menggunakan Browser Firefox)
Rangkuman
Ini adalah hal dasar dan terpenting untuk dipahami tentang Hasil Method
Action. Jika Anda memiliki pertanyaan, jangan ragu untuk menghubungi saya di
komentar. Juga, berikan umpan balik baik positif atau negatif, itu akan
membantu saya membuat artikel saya lebih baik dan meningkatkan antusiasme saya
untuk membagikan pengetahuan saya.
0 Comments