Apa perbedaan antara ViewResult()
dan ActionResult()
dalam ASP.NET MVC?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
Apa perbedaan antara ViewResult()
dan ActionResult()
dalam ASP.NET MVC?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
Jawaban:
ActionResult adalah kelas abstrak yang dapat memiliki beberapa subtipe.
ViewResult - Memberikan tampilan yang ditentukan ke aliran respons
PartialViewResult - Memberikan tampilan parsial tertentu ke aliran respons
EmptyResult - Respons kosong dikembalikan
RedirectResult - Melakukan pengalihan HTTP ke URL yang ditentukan
RedirectToRouteResult - Melakukan pengalihan HTTP ke URL yang ditentukan oleh mesin perutean, berdasarkan data rute yang diberikan
JsonResult - Menerialisasikan objek ViewData yang diberikan ke format JSON
JavaScriptResult - Mengembalikan sepotong kode JavaScript yang dapat dieksekusi pada klien
ContentResult - Menulis konten ke aliran respons tanpa memerlukan tampilan
FileContentResult - Mengembalikan file ke klien
FileStreamResult - Mengembalikan file ke klien, yang disediakan oleh Stream
FilePathResult - Mengembalikan file ke klien
ActionResult adalah kelas abstrak.
ViewResult berasal dari ActionResult . Kelas turunan lainnya termasuk JsonResult dan PartialViewResult .
Anda mendeklarasikannya dengan cara ini sehingga Anda dapat memanfaatkan polimorfisme dan mengembalikan tipe yang berbeda dengan metode yang sama.
misalnya:
public ActionResult Foo()
{
if (someCondition)
return View(); // returns ViewResult
else
return Json(); // returns JsonResult
}
Itu untuk alasan yang sama Anda tidak menulis setiap metode setiap kelas untuk mengembalikan "objek". Anda harus sespesifik mungkin. Ini sangat berharga jika Anda berencana untuk menulis tes unit. Tidak ada lagi pengujian tipe pengembalian dan / atau casting hasilnya.
ViewResult adalah subkelas dari ActionResult. Metode Lihat mengembalikan ViewResult. Jadi sebenarnya dua cuplikan kode ini melakukan hal yang persis sama. Satu-satunya perbedaan adalah bahwa dengan yang ActionResult, controller Anda tidak menjanjikan untuk mengembalikan tampilan - Anda bisa mengubah tubuh metode untuk mengembalikan RedirectResult atau sesuatu yang lain tanpa mengubah definisi metode.
Sementara jawaban lain telah mencatat perbedaan dengan benar, perhatikan bahwa jika Anda benar-benar mengembalikan ViewResult hanya lebih baik untuk mengembalikan tipe yang lebih spesifik daripada tipe ActionResult dasar. Pengecualian yang jelas untuk prinsip ini adalah ketika metode Anda mengembalikan beberapa jenis yang berasal dari ActionResult.
Untuk diskusi lengkap tentang alasan di balik prinsip ini, silakan lihat diskusi terkait di sini: Haruskah Metode Pengontrol ASP.NET MVC Mengembalikan ActionResult?
Di Controller, seseorang dapat menggunakan sintaks di bawah ini
public ViewResult EditEmployee() {
return View();
}
public ActionResult EditEmployee() {
return View();
}
Dalam contoh di atas, hanya tipe pengembalian bervariasi. satu kembali ViewResult
sedangkan yang lain kembali ActionResult
.
ActionResult adalah kelas abstrak. Itu dapat menerima:
ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileStreamResult, FilePathResult dll.
Itu ViewResult
adalah subkelas dari ActionResult
.
Dalam Kontroler saya telah menentukan kode di bawah ini dengan ActionResult yang merupakan kelas dasar yang dapat memiliki 11 subtipe dalam MVC seperti: ViewResult, PartialViewResult, EmptyResult, RedirectResult, JsonResult, JavaScriptResult, FileRontultes Fileult, Fileult, FileStreamRathult
public ActionResult Index()
{
if (HttpContext.Session["LoggedInUser"] == null)
{
return RedirectToAction("Login", "Home");
}
else
{
return View(); // returns ViewResult
}
}
//More Examples
[HttpPost]
public ActionResult Index(string Name)
{
ViewBag.Message = "Hello";
return Redirect("Account/Login"); //returns RedirectResult
}
[HttpPost]
public ActionResult Index(string Name)
{
return RedirectToRoute("RouteName"); // returns RedirectToRouteResult
}
Demikian juga kita dapat mengembalikan semua 11 subtipe ini dengan menggunakan ActionResult () tanpa menentukan setiap metode subtipe secara eksplisit. ActionResult adalah hal terbaik jika Anda mengembalikan berbagai jenis tampilan.
Untuk menghemat waktu Anda di sini adalah jawaban dari tautan dalam jawaban sebelumnya di https://forums.asp.net/t/1448398.aspx
ActionResult adalah kelas abstrak, dan kelas dasar untuk kelas ViewResult.
Dalam kerangka kerja MVC, ia menggunakan kelas ActionResult untuk referensi objek metode tindakan Anda kembali. Dan memanggil metode ExecuteResult di atasnya.
Dan ViewResult adalah implementasi untuk kelas abstrak ini. Ini akan mencoba untuk menemukan halaman tampilan (biasanya halaman aspx) di beberapa jalur yang telah ditentukan (/ views / controllername /, / views / shared /, dll) dengan nama tampilan yang diberikan.
Biasanya merupakan praktik yang baik untuk meminta metode Anda mengembalikan kelas yang lebih spesifik. Jadi jika Anda yakin bahwa metode tindakan Anda akan mengembalikan beberapa halaman tampilan, Anda dapat menggunakan ViewResult. Tetapi jika metode tindakan Anda mungkin memiliki perilaku yang berbeda, seperti memberikan tampilan atau melakukan pengalihan. Anda bisa menggunakan ActionResult kelas dasar yang lebih umum sebagai tipe pengembalian.