ZDIRY-TUFWT-EBONM-EYJ00-IDBLANTER.COM
ZDIRY-TUFWT-EBONM-EYJ00

BLANTERWISDOM105

Perbedaan Action Method di ASP NET (ActionResult, JsonResult, ContentResult dan lain-lain))

6/20/2020

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?

  1. Content Returning Results
  2. Redirection Results
  3. 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

  1. Download terlebih dahulu IlSpy dan Extract
  2. Jalankan ILSpy
  3. 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.


Share This :

0 Comments