Perbedaan Antara ViewResult () dan ActionResult ()


295

Apa perbedaan antara ViewResult()dan ActionResult()dalam ASP.NET MVC?

public ViewResult Index()
{
    return View();
}

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

12
Pertanyaan yang bagus Saya menonton video dan membuat tes unit, instruktur pertama-tama mengubah jenis tindakan yang akan dia uji dari ActionResult menjadi ViewResult. Tidak ada penjelasan .... Saya seperti "Apa yang bisa kita ubah secara acak? Tanpa penjelasan"
Doug Chamberlain

3
Mungkin dokumentasi ini bermanfaat :) msdn.microsoft.com/en-us/library/…
user3885927

Jawaban:


372

ActionResult adalah kelas abstrak yang dapat memiliki beberapa subtipe.

Subtipe ActionResult

  • 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

Sumber daya


5
apa keuntungan dari mengembalikan ViewResult daripada ActionResult - apakah itu hanya sedikit lebih semantik dan menunjukkan niat Anda - tetapi dalam praktik biasanya tidak ada bedanya?
niico

121

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
}

2
Apakah ini berarti bahwa kita harus selalu mengembalikan ActionResult sehingga kita mendapatkan keuntungan darinya. Atau apakah ada batasan atau efek samping dari ini?
Adarsh ​​Kumar

5
@ Adarsh ​​- sama dengan kelas abstrak di C #. Deklarasikan seperti itu jika Anda ingin merangkum implementasi di dalam metode atau ingin membuktikan API Anda di masa mendatang untuk jenis turunan lainnya. Jika tidak, gunakan beton. Saya biasanya menggunakan beton (misalnya ViewResult atau JsonResult)
RPM1984

31

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.


Kode bersih dan pengujian unit adalah manfaat menggunakan ViewResult berdasarkan pengalaman saya.
JoshYates1980

20

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.


11

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?


4

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 ViewResultsedangkan 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.


4
Saya tidak yakin apakah ini yang Anda maksud, tapi kalau-kalau saya ingin menjelaskan bahwa Anda tidak dapat memiliki kedua metode pada saat yang sama, karena nama mereka dan (tidak) parameternya sama. Tidak mungkin untuk membebani metode dengan hanya mengubah jenis hasil.
Andrew

0

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.


0

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.